Re: using threads in twisted

Stephen Thorne <[email protected]>
Newsgroups gmane.comp.python.twisted.web
Message-ID <[email protected]>
On 2011-04-15, Ivan wrote:
> for example, I want to run two tasks ( using thread ), waiting while this tasks is end and after run  next several tasks
> How to do this using twisted ? Any example ?
> 
> def task(n):
>     sleep n
> 
> 1) 1,2 tasks begin  ( thread )
> 2) waiting while all tasks is ends
> 3) ...
> 4) run 3,4,5,6,7 tasks ( thread )
> 5) waiting while all tasks is ends

You can use a combination of deferToThread() and DeferredList() to do
this. It's quite simple:

from twisted.internet import reactor
from twisted.internet import threads
from twisted.internet import defer

def worker(arg):
    print 'I do stuff in threads'
    return arg + 1

def first_round():
    print 'Starting workers'
    task1 = threads.deferToThread(worker, 1)
    task2 = threads.deferToThread(worker, 2)
    return defer.DeferredList([task1, task2])

def second_round(results):
    print 'result of first round is:', results
    l = []
    for x in range(10):
        l.append(threads.deferToThread(worker, x))
    return defer.DeferredList(l)

def report(results):
    print 'result of second round is:', results

def end(results):
    print results
    reactor.stop()

d = first_round()
d.addCallback(second_round)
d.addCallback(report)
d.addBoth(end)

reactor.run()

-- 
Regards,
Stephen Thorne
Development Engineer
Netbox Blue
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.