[Twisted-Python] blocking and threads
Jp Calderone
exarkun at divmod.com
Wed Apr 27 07:20:53 MDT 2005
On Wed, 27 Apr 2005 05:49:01 -0700 (PDT), Joachim Boomberschloss <boomberschloss at yahoo.com> wrote:
>Hi all,
>
>I am just wondering: from the Twisted how-tos, it
>appears that doing anything that could possibly take
>arbitrarily long to execute should not be done in the
>reactor's main thread; i.e. it should be done using an
>asynchronous library (such as Twisted's network
>communication facilities), or in a different thread,
>using the reactor's thread pool.
>
>So it would seem that many things that may be
>considered "primitive" in Python, such as file IO,
>require some kind of patching if they are to be
>immediately usable by a Twisted application. I came up
>with the following solution, which enables calling any
>function in a different thread with a deferred
>interface; I just wanted to make sure that I'm not
>completely missing some point:
>
>def deferToThread(func, *args, **kargs):
> """executes the given function in a thread, and
>passes the return value to the deferred we return"""
> d = defer.Deferred()
> reactor.callInThread(_calledInThread, d, func, *args,
>**kargs)
> return d
>
>def _calledInThread(d, func, *args, **kargs):
> try:
> retval = func(*args, **kargs)
> except Exception, x:
> reactor.callFromThread(d.errback, x)
> else:
> reactor.callFromThread(d.callback, retval)
>
Looks like you've got a pretty firm understanding. The one thing you did miss is the twisted.internet.threads module, which provides the deferToThread function.
Jp
More information about the Twisted-Python
mailing list