我有一個Python腳本處理來自.NET Remoting的異步回調。這些回調在虛擬(工作者)線程中執行。從我的回調處理程序中,我需要調用我在腳本中定義的函數,但是我需要在主線程中執行該函數。在主線程從虛擬線程調用中執行Python函數
主線程是將命令發送到服務器的遠程客戶端。其中一些命令會導致異步回調。
基本上,我需要.NET的Invoke方法的等價物。這可能嗎?
我有一個Python腳本處理來自.NET Remoting的異步回調。這些回調在虛擬(工作者)線程中執行。從我的回調處理程序中,我需要調用我在腳本中定義的函數,但是我需要在主線程中執行該函數。在主線程從虛擬線程調用中執行Python函數
主線程是將命令發送到服務器的遠程客戶端。其中一些命令會導致異步回調。
基本上,我需要.NET的Invoke方法的等價物。這可能嗎?
你想使用類來建立一個隊列,你的虛擬線程用函數填充,並且你的主線程使用它。
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()
演示:
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()
打印:
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
,然後阻止永遠
非常酷。 Python使委託傳遞和存儲變得微不足道。我很感謝你非常詳細的回答。 –
@JimC:這是爲什麼它是我最喜歡的語言=)的一部分。乾杯 – Claudiu
什麼主線程呢?你需要以某種方式發信號並讓它調用該函數。如果主線程一般等待事件發生,然後發信號。如果主線程執行處理,則將函數調用到隊列中,讓主線程偶爾檢查和處理隊列。 – Claudiu
增加了信息發佈。 –
嗯...思考更多....如果回調發生,而主要是等待服務器從通話返回控制,沒有辦法讓主要做任何事情,是嗎? –