あなたのダミーのスレッドが機能して、あなたのメインスレッドが消費する移入キューを設定するクラスを使用します。
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
、その後ブロック永遠に
メインスレッドが何をするのでしょうか?何とかそれを伝え、それを関数に呼び出す必要があります。メインスレッドが一般的に起こるのを待っている場合は、それを通知します。メインスレッドが処理を行う場合は、呼び出される関数をキューに入れ、メインスレッドに時々キューをチェックして処理させます。 – Claudiu
投稿情報を追加しました。サーバーは、呼び出しから制御を返すようにするために、メインが待っている間にコールバックが発生した場合、他に何もするメインを取得する方法はありません –
うーん...もっと考え......、ありますか?コントロールを返すために、サーバー、またはスケジュールされた関数呼び出しのいずれか: –