Hi, Probably not the best group to post my question but I'm sure there is some people here that use Twisted. First here is the beginning of my source code:
from twisted.internet import reactor, defer, threads import time class CompilerThread(object): def __init__(self, task, delay): self.task = task self.delay = delay def _processing(self, delay): print 'Start :', self.task # Simulate delayed result, to fire immediately use self.d.callback(self.task) time.sleep(delay) return self.task def compile(self): print 'Compile :', self.task print self # Create Deferred in another thread and add callback self.d = threads.deferToThread(self._processing, self.delay).addCallback(self.print_result) # Return the deferred, this way you could add callback later return self.d def print_result(self, result): # Print result print 'Compiler result :', result, self.task # MUST return result otherwise next callback receive None return result # Create Compiler objects ct1 = CompilerThread('*OBJECT 1*', 2) ct2 = CompilerThread('*OBJECT 2*', 3) ct3 = CompilerThread('*OBJECT 3*', 5) # Use succeed to create a deferred already fired d = defer.succeed(None) Now my problem: With this code everything work fine: d.addCallback(lambda result: ct1.compile()) d.addCallback(lambda result: ct2.compile()) d.addCallback(lambda result: ct3.compile()) reactor.callLater(20, reactor.stop) reactor.run() Output: Compile : *OBJECT 1* <__main__.CompilerThread object at 0x00BAD070> Start : *OBJECT 1* Compiler result : *OBJECT 1* *OBJECT 1* Compile : *OBJECT 2* <__main__.CompilerThread object at 0x00BAD050> Start : *OBJECT 2* Compiler result : *OBJECT 2* *OBJECT 2* Compile : *OBJECT 3* <__main__.CompilerThread object at 0x00CDA4B0> Start : *OBJECT 3* Compiler result : *OBJECT 3* *OBJECT 3* But when I try to replace this code with a for loops, something goes wrong: l = [ct1, ct2, ct3] for c in l: d.addCallback(lambda result: c.compile()) reactor.callLater(20, reactor.stop) reactor.run() Output: Compile : *OBJECT 1* <__main__.CompilerThread object at 0x00BAD030> Start : *OBJECT 1* Compiler result : *OBJECT 1* *OBJECT 1* Compile : *OBJECT 3* <__main__.CompilerThread object at 0x00CD9470> Start : *OBJECT 3* Compiler result : *OBJECT 3* *OBJECT 3* Compile : *OBJECT 3* <__main__.CompilerThread object at 0x00CD9470> Start : *OBJECT 3* Compiler result : *OBJECT 3* *OBJECT 3* OBJECT 3 run 2 times and OBJECT 2 never ?!? Any idea ? Maybe something related to Threads ? Thanks for your help. -- http://mail.python.org/mailman/listinfo/python-list