[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