[Twisted-Python] locking threads when deferToThread is used

Ladislav Andel ladaan at iptel.org
Wed Aug 8 11:58:16 EDT 2007


Thank you for your help.
Well, I'm trying to get into the problem step by step so please receive 
my apologies about not so professional approach
to the problem.

I have following code below with a few problems.

1) I need to call getServerResponse of SIP servers for given list 
domains periodically.
    I have tried to use callLater method but probably at wrong places.
This way it runs only once. In the future it should be at least every 5 
minutes.

2)
In my code is something wrong.
I get the Server response but also following error.

Traceback (most recent call last):
 File 
"/home/data/iptel_summer_2007/sipcraft1/src/sipcraft/multideferred.py", 
line 46, in ?
   reactor.run()
 File "/usr/lib/python2.4/site-packages/twisted/internet/posixbase.py", 
line 220, in run
   self.mainLoop()
 File "/usr/lib/python2.4/site-packages/twisted/internet/posixbase.py", 
line 228, in mainLoop
   self.runUntilCurrent()
--- <exception caught here> ---
 File "/usr/lib/python2.4/site-packages/twisted/internet/base.py", line 
533, in runUntilCurrent
   f(*a, **kw)
 File "/usr/lib/python2.4/site-packages/twisted/internet/defer.py", line 
239, in callback
   self._startRunCallbacks(result)
 File "/usr/lib/python2.4/site-packages/twisted/internet/defer.py", line 
290, in _startRunCallbacks
   raise AlreadyCalledError
twisted.internet.defer.AlreadyCalledError:




----------------------------- code ---------------------------------


from twisted.internet import reactor, defer, threads

from siptest import siptest_f
from twisted.internet.threads import deferToThread


test_opts = 
{'username':'test','transport':'udp','localport':'5085','password':'test'}
domain = ['sip.1und1.de', 'sip.babble.net']

class Getter:
     def gotResults(self, domain, test_opts):
             if len(domain) != 0:
           self.d.callback(siptest_f(domain, test_opts))
       else:
           self.d.errback(ValueError("You used an odd number!"))

   def _print(self, r, domain):
             return domain, r
       def getServerResponse(self, domain, test_opts):
                     self.d = threads.deferToThread(self.gotResults, 
domain, test_opts)
       self.d.addCallback(self._print, domain)
       return self.d

def printData(d):
   print d

def printError(failure):
   import sys
   sys.stderr.write(str(failure))

def test():
   for dom in domain:
       g = Getter()
       d = g.getServerResponse(dom, test_opts)
       d.addCallback(printData)
       d.addErrback(printError)

if __name__ == '__main__':
   test()
   reactor.run()
 





More information about the Twisted-Python mailing list