[Twisted-Python] AlreadyCalledError trying more than a server
Antonio Beamud Montero
antonio.beamud at gmail.com
Tue Sep 29 04:27:34 EDT 2009
Hi all:
I've implemented my client as comes in twisted documentation
(FingerProxy example).
I want to connect with several machines at the same time, send and
receive data from this servers and start again (monitoring in one word).
I've created a ClientFactory and a loop like this:
conf['hosts'] = [list of hostnames]
commands = [list of string commands, like 'status' or 'temp']
def runall(data):
nodes = []
for h in conf['hosts']:
mcf = manager.ClientFactory(commands)
reactor.connectTCP(h, SERVER_PORT, mcf)
nodes.append(mcf.deferred)
dlist = defer.DeferredList(nodes)
dlist.addCallback(runall)
dlist.addErrback(lambda _: None)
Only when the ClientFactory receives a 'bye' response, call's the
d.callback('ok').
With a only host, works perfect, but trying to run against two o more
hosts, the next exception is raised:
File "/usr/lib/python2.6/site-packages/twisted/internet/defer.py", line
293, in _startRunCallbacks
raise AlreadyCalledError
twisted.internet.defer.AlreadyCalledError:
In my debug console:
This is the deferredList
[<Deferred at 0x84c3d6c>, <Deferred at 0x852d1ac>]
...
IPv4Address(TCP, 'ira', 10162) <Deferred at 0x84c3d6c>
IPv4Address(TCP, 'lujuria', 10162) <Deferred at 0x84c3d6c current
result: 'ok'>
Twisted is invoking the same deferred, and chaining them, the 'ok'
result is produced by the 'ira' callback invokation instead using everly
deferred separately.
What I'm doing wrong...?
A lot of thanks.
More information about the Twisted-Python
mailing list