On Thu, 08 Feb 2007 14:45:20 +0100, Remi Cool <[EMAIL PROTECTED]> wrote:
Jean-Paul Calderone wrote:
On Thu, 08 Feb 2007 13:31:27 +0100, Remi Cool
<[EMAIL PROTECTED]> wrote:
[snip]
I tend to think not, because when I call a method with a 5 sec delay
from a "runInteraction" thread, the thread returns when it handled the
call. This is how I prefer it in this case, but when I want to use the
xmlrpcCall method from a non "runInteraction" call, do I need to wrap it
up in a thread myself?
Oops! You _can't_ do that. Twisted APIs must be invoked from the
reactor
thread. They don't work in any other thread.
Let me explain:
a user calls the xml-rpc method "init" on my twisted xmlrpc server like:
xmlrpc_init(self):
""""""
return self.service.connPool.runInteraction(myInit, self.service)
The myInit function has to fetch some data from the database and from a
remote xml-rpc server.
So ... first I get the data from the database , print a log line ...
call the service.xmlrpcCall method ... and print another log line.
The method on the remote xml-rpc server delays 5 secs, prints a log line
and then sends back a string.
The log lines are in the right order. But you say the xmlrcpCall method
doesn't block?
It doesn't block, but it doesn't work very well, since it uses Twisted APIs
from a non-reactor thread. The 5 seconds are probably just spent idling,
and then some unrelated event wakes up the reactor, at which point it then
notices that you asked it to do something, and does it.
So if I understand correctly, I can't use any twisted api's in threads,
even if they are created with threads.deferToThread?
Correct. You can call back into the reactor thread, though. See the
callFromThread method of the reactor.
Jean-Paul
_______________________________________________
Twisted-web mailing list
[email protected]
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web