[Twisted-Python] help using deferred

Luigi Conte luigiandcosolutions at gmail.com
Fri May 15 08:58:11 MDT 2009


2009/5/11 Jean-Paul Calderone <exarkun at divmod.com>

> On Mon, 11 May 2009 19:49:19 +0200, Luigi Conte <
> luigiandcosolutions at gmail.com> wrote:
> >
> > [snip]
> >in my script I have to use connect method and then I have to do some
> >operations first of calling the start method
> >1) start connection
> >
> >    def startConnection(self):
> >        d = my_api.connect(self.ctrl_ip, self.ctrl_port, self.user,
> >self.pwd)
> >        d.addCallback(self.postConnection)
>
> Since you omitted the definition of postConnection, I have no way to know
> what this does.
>
> >        d.addErrback(twisted.python.log.err)
>
> Regardless, this is the wrong place to insert this errback.  You should
> read
> the Deferred documentation to learn what consequence it will have on your
> program's flow.
>
> http://twistedmatrix.com/projects/core/documentation/howto/defer.html is
> probably a good place to start.
>
> >        print "Connection added"
> >        return d
> >2) operation before starting a virtual machine:
> >def newVMCfg(self, new_vms_cfg):
> >       #...
> >       #some operations
> >       #if condition valid I try to start the virtual machine
> >                        # is this the correct way to pass args to the
> start
> >method?
> >                        d = self.d.addCallback(self.startVM,(new_vm,
> >self.lnms[i])
> >                        print "started vm %s"%new_vm
> >        return d
> >
> >in the main process I call them as:
> >d = startConnection()
> >d.addCallback(newVMCfg, arg)
> >
> >Is it correct? Because the process stops at the first method called: I see
> >only "connection added".
>
> That should indicate to you that something is going wrong after that print
> statement is reached.  So examine what your program tries to do after that
> point.  You may want to use a debugger.  You may want to try writing some
> unit tests.
>
> Jean-Paul
>
> _______________________________________________
> Twisted-Python mailing list
> Twisted-Python at twistedmatrix.com
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>

I looked at the documentation and I understood something about defferd and
callbacks. I edited my code but it does nothing...
I'm going to explain the scenario and what I want to do:
- there is an api that provides some methods (connect, start, disconnect).
- all those methods return a deferred object
- I have an object that first tries to connect, then reads a file and calls
the start method many times in a loop cicle of his method.

I want to use the connect and wait until I'm really connected. How can I do
this using the deferred object that the api returns to me?
I want to do the same thing each time I call the start method from the api:
I want to wait the completing of start operation before doing another start
invocation.

so I do:
in the main process:
    d = gest.connettiCLI_to_CTRL()

in gest class I have:
    def connettiCLI_to_CTRL(self):
        d = api.connect(self.ctrl_ip, self.ctrl_port, self.user, self.pwd)
        d.addCallback(self.cbConnected)
        return d

    def cbConnected(self, connectResult):
        return self.postConnection()

    def postConnection(self):
        # I do something but I don't call api's methods here
        # then I go to the next step returning the next method
        return self.interpretaNewVMCfg(self.vms_cfg)

    def interpretaNewVMCfg(self, new_vms_cfg):
        for i in candidati:
            #start operation in loop
            #here I want to control each start operation
            d = api.startVM(new_vm, self.lnms[i])
        return d

thank you so much
-------------- next part --------------
An HTML attachment was scrubbed...
URL: </pipermail/twisted-python/attachments/20090515/1a48cb4f/attachment.html>


More information about the Twisted-Python mailing list