[Twisted-Python] Calling deferToThread from a thread

Reza Lotun rlotun at gmail.com
Thu Sep 18 05:42:35 EDT 2008


Hi All,

I have a data store api that mandates the return of deferreds for each
call. I have a number of implementations for the api - an in-memory
one for testing, and a number of other network + disk based apis.

My issue is this - I'm using py.test for unit testing (I'm aware of
trial, but for compatibility reasons with the rest of the project I
haven't looked into using it). To test deferred-based code I have set
up a separate thread which the reactor runs in (the setup and teardown
code is shown below for anyone who is interested).

def net():
    reactor.run(installSignalHandlers=0)

def setup_module(mod):
    global net_thread
    net_thread = threading.Thread(target=net)
    net_thread.start()
    time.sleep(1)

def teardown_module(module):
    reactor.callFromThread(reactor.stop)

This seems to work generally fine. The problem (or at least I *think*
it's the problem) is that in one of my implementations uses
deferToThread internally to create a deferred which it then returns to
the caller. Is it thread safe to call a deferToThread in a separate
thread? Normally I'd do a reactor.callFromThread, but I'm not sure how
to get a deferred by this construct.

I see two options:
1. In my unit test I write a function f which makes the api call and
gets the deferred, and sets it to a local variable within the test
instance. Then I schedule f to run in the reactor thread via
reactor.callFromThread
2. I look into trial which has support for this kind of stuff??

Thanks for any help.

Cheers,
Reza




More information about the Twisted-Python mailing list