[Twisted-web] Newbie question about chaining deffereds
descentspb at gmail.com
Mon Dec 21 06:48:01 EST 2009
Reza Lotun wrote:
> Hi Igor,
>> I need to download a videofile, a thumbnail to it, process that
>> videofile, and after the processing is finished, process the thumbnail
>> with the result of processing the video.
>> url = 'http://..../video.flv'
>> filename = 'video.flv'
>> video_deffered = downloadPage(url, filename)
>> video_deffered.addCallback(process_video, filename) => process_video
>> returns video_id
>> url = 'http://..../thumbnail.jpg'
>> filename = 'thumbnail.jpg'
>> image_deffered = downloadPage(url, filename)
>> image_deffered.addCallback(process_image, filename) =< video_id needed here
> As far as I understand you want to:
> 1. Get the videofile - represented by video_deferred
> 2. Process the videofile after it's downloaded (the function process_video)
> 3. Get the thumbnail in parallel - image_deferred
> 4. Do a final processing *after* step 2 and step 3 (process_image)
> What you want to do is fire off video_deferred and image_deferred as
> you do immediately, but put the two deferreds in a DeferredList. What
> this allows you to do is attach a callback that will only fire when
> *both* jobs have been completed. The addCallback on that deferred list
> will be process_image.
> To run jobs in threads, please take a look a
> Hope that helps.
Thank you, Reza, for a quick and helpful answer! That worked perfectly.
And to make my existing callbacks non-blocking conveniently, I wrote a
decorator for deferToThread, looks like this:
def wrap(*args, **kwargs):
return deferToThread(func, *args, **kwargs)
More information about the Twisted-web