2013-09-24 6 views
13

ダミースレッドで呼び出しからメインスレッドでPythonの機能を実行します。これらのコールバックはダミー(ワーカー)スレッドで実行されます。私のコールバックハンドラの中から、スクリプトで定義した関数を呼び出す必要がありますが、メインスレッドで実行する関数が必要です。は、私は.NETリモート処理からaynchronousコールバックを処理するPythonスクリプトを持って

メインスレッドがサーバーにコマンドを送信し、リモート・クライアントです。これらのコマンドの中には、非同期コールバックが発生するものがあります。

基本的に、私は、.NETのInvokeメソッドと同等のものを必要とします。これは可能ですか?

+0

メインスレッドが何をするのでしょうか?何とかそれを伝え、それを関数に呼び出す必要があります。メインスレッドが一般的に起こるのを待っている場合は、それを通知します。メインスレッドが処理を行う場合は、呼び出される関数をキューに入れ、メインスレッドに時々キューをチェックして処理させます。 – Claudiu

+0

投稿情報を追加しました。サーバーは、呼び出しから制御を返すようにするために、メインが待っている間にコールバックが発生した場合、他に何もするメインを取得する方法はありません –

+0

うーん...もっと考え......、ありますか?コントロールを返すために、サーバー、またはスケジュールされた関数呼び出しのいずれか: –

答えて

18

あなたのダミーのスレッドが機能して、あなたのメインスレッドが消費する移入キューを設定する​​クラスを使用します。

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 

、その後ブロック永遠に

+0

非常にクールです。 Pythonはデリゲートの受け渡しと格納を簡単にします。私はあなたの非常に詳細な答えに感謝します。 –

+0

@JimC:それはなぜ私のお気に入りの言語の一部です=)。乾杯 – Claudiu

関連する問題