[Twisted-Python] callFromThread with return
andrew-twisted at puzzling.org
Thu Sep 18 06:29:04 EDT 2003
On Thu, Sep 18, 2003 at 11:46:03AM +0200, Syver Enstad wrote:
> Egor Cheshkov <egor at iplus.ru> writes:
> > If I understand right, I should use deferToThread to shedule long
> > running task from main thread (that running event loop), i need
> > different thing. I need to shedule a method to be run in the main
> > event loop from another thread. It is the thing that callFromThread
> > does, but callFromThread does not return anything. I need to get
> > result from such call. Is it possible?
> Can't you pass yourself and have the method that you pass to
> callFromThread callback on a method on yourself with the results?
But that won't run the callback in the worker thread.
Here's the situation in dodgy ascii art:
(Twisted reactor, etc)
| ->----------------------callInThread starts
v Worker Thread running
causes other_func() to .
run in Main Thread .
| Worker Thread waits
| for other_func result
But how does the .
Main Thread pass a result .
to Worker Thread and .
resume its execution? ?
There needs to be a wrapper function around callFromThread that blocks the
worker thread on a threading.Event or similar, and then causes the Event to
be fired when the function finishes, and returns the result.
Or, in untested code:
import threading, sys
from twisted.internet import reactor
e = threading.Event()
l = 
result, ok = l
# Whee! Cross-thread exceptions!
raise result, result, result
This is utterly untested. It probably should be tested and added to
twisted.internet.util or t.i.threads, though.
More information about the Twisted-Python