我有一个 Python 脚本,用于处理来自 .NET Remoting 的异步回调。这些回调在虚拟(工作)线程中执行。从我的回调处理程序内部,我需要调用我在脚本中定义的函数,但我需要该函数在主线程中执行。
主线程是向服务器发送命令的远程客户端。其中一些命令会导致异步回调。
基本上,我需要相当于 .NET 的 Invoke 方法。这可能吗?
您想使用Queue http://docs.python.org/2/library/queue.html (now queue https://docs.python.org/3/library/queue.html来自 python 3) 类来设置一个队列,您的虚拟线程将使用函数填充该队列,并且您的主线程将使用该队列。
import Queue
#somewhere accessible to both:
callback_queue = Queue.Queue()
def from_dummy_thread(func_to_call_from_main_thread):
callback_queue.put(func_to_call_from_main_thread)
def from_main_thread_blocking():
callback = callback_queue.get() #blocks until an item is available
callback()
def from_main_thread_nonblocking():
while True:
try:
callback = callback_queue.get(False) #doesn't block
except Queue.Empty: #raised when queue is empty
break
callback()
Demo:
import threading
import time
def print_num(dummyid, n):
print "From %s: %d" % (dummyid, n)
def dummy_run(dummyid):
for i in xrange(5):
from_dummy_thread(lambda: print_num(dummyid, i))
time.sleep(0.5)
threading.Thread(target=dummy_run, args=("a",)).start()
threading.Thread(target=dummy_run, args=("b",)).start()
while True:
from_main_thread_blocking()
Prints:
From a: 0
From b: 0
From a: 1
From b: 1
From b: 2
From a: 2
From b: 3
From a: 3
From b: 4
From a: 4
然后永远阻塞
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)