[Twisted-Python] How to safely stop a chain of deferreds

Orestis Markou orestis at orestis.gr
Tue Jun 28 13:50:21 EDT 2011


On 28 Jun 2011, at 20:37, exarkun at twistedmatrix.com wrote:

> On 01:30 pm, tomw at ubilix.com wrote:
>> Hi,
>> 
>> in a GUI application I'm using quite a comprehensive chain of deferreds
>> and I'm running the mainloop from the glib2reactor. At a certain point
>> of my application I need to terminate the entire chain of deferreds to
>> make sure that no more data is loaded and processed. Stopping the
>> reactor does not work as the entire GUI would terminate, too. I tried 
>> to
>> cancel the first deferred, hoping that the cancel event will be
>> forwarded to the next deferred in the chain or at least invoke an
>> errback, but for some reason it does not work and the deferreds seem to
>> run forever. Any ideas on how to solve this issue?
> 
> What would you do if you had this non-Deferred using code:
> 
>    x = a()
>    y = b(x)
>    z = c(y)
> 
> and you decided in b that you need to terminate your data loading and 
> processing?

Pretty much what everyone is insinuating is that:

a) By your description it is not obvious what the application is doing, so a better description will be more helpful
b) You are using incorrect terms, making even harder to give advice
c) Callback chains don't have any built-in support for any kind of cancelling/stopping.
d) Deferreds have a cancel method but it's up to the creator of the Deferred to provide any meaning to it

Now, if you have a loop loading data and passing it to a chain of callbacks, and you'd need to stop mid-processing, the way I'd do that is to have a 'isStopped' boolean variable that can be set to True to initiate the stopping procedure. You will then stop loading any data and finish processing existing data. However, this is little more than a guess based upon my very vague understanding of the problem you are trying to describe.

Orestis




More information about the Twisted-Python mailing list