twisted - locking threads when deferToThread is used

Chris Mellon arkanes at
Wed Aug 8 16:09:46 CEST 2007

On 8/8/07, Ladislav Andel <ladaan at> wrote:
> Hi,
> I'm writing an application which will be periodically testing servers.
> I will have a global list of these servers(domain names) and need to do
> few tasks.
> 1) DNS checks - I will use asynchronous twisted-names for it
> - in case there is a difference comparing to the list it should update
> the list(then also in DB)
> 2) ICMP pings - should be also possible to do it asynchronously
> 3) Blocking function which will be pinging with SIP requests
> - here I will use function deferToThread to make it non-blocking.
> Questions:
> 1) How do I lock each thread when writing to a global list in twisted?
> 2) How will I put together all three results mentioned above in the
> global list
> - is it by using function callLater ?
> 3) Could you help me with a rough skeleton of this application, please?
> Thank you,
> Lada

deferToThread returns the result of the passed function in a Deferred.
Callbacks and errbacks will be run in the main event loop, so you
don't need to worry about thread safety of the callbacks, just of the
function itself.

The basic model would look something like this:

def querySIP(what):
    return sip.query(what) #native, *threadsafe*, blocking call

sipquery = reactor.deferToThread(querySIP, what)
sipquery.addCallback(lambda result: sip_results.append(result))

More information about the Python-list mailing list