[Twisted-Python] at what point does reactor.run() need to be called?

Michal Pasternak michal at pasternak.w.lub.pl
Tue Apr 6 06:01:27 EDT 2004


Damon Fasching [Mon, Apr 05, 2004 at 11:39:57PM -0700]:
> The following two modules work fine together.

reactor.run() enters an event-controlled loop (it's the same as "mainloop"
in GUI toolkits you could program in), so you should call it after you do
all initialization stuff.

> However, if the call to reactor.run() is moved any
> higher in client.py, the client seems to hang.  For

It doesn't hang, it just gets the root object, but has no callback to pass
it to.

If it hangs (locks-up hard), it's a bug, examine & report it.

> I would like to be able to dynamically connect to new
> servers after starting my application and intereacting
> with other servers, and so after already having called
> reactor.run().  Can I do this?  I'm sure it is
> possible.  But the quick test above makes it seem that
> I have to invoke getRootObject() AND attach a callback
> to the returned deferred before I can invoke
> reactor.run().

Yes, that's right.

The point you've missed:

	def connectToNewServersNStuff():
		# connect to one server
		pass
	
	# do all initialisation
	# ...
	
	reactor.callLater(0, connectToNewServersNStuff)	
	reactor.run()	

The value, that getRootObject() returns is a Deferred object. This is a
"delayed" function call (which is also non-blocking), so the *real*
rootObject is passed to the Deferred.callback function.

-- 
mp




More information about the Twisted-Python mailing list