3

呼び出し元の関数が別のスレッドにあるメイン スレッドで関数を実行する可能性を知りたいです。

以下の例を検討してください

from thread import start_new_thread

def add(num1,num2):

    res = num1 + num2
    display(res)

def display(ans):
    print ans

thrd = start_new_thread(add,(2,5))

ここで私はadd()新しいスレッドを呼び出しています。display()つまり、ディスプレイも同じスレッドで実行されています。

display()そのスレッドの外で実行する方法を知りたいです。

以下の回答による新しいコード

ユーザーからの入力を受け入れて結果を出力しようとしている場合。入力を求めるのは 1 回だけですが、繰り返しではありません...

from threading import Thread # threading は thread モジュールよりも優れています from Queue import Queue

q = Queue() # キューを使用してワーカー スレッドからメイン スレッドにメッセージを渡す

def add():
    num1=int(raw_input('Enter 1st num : '))
    num2=int(raw_input('Enter 2nd num : '))
    res = num1 + num2
    # send the function 'display', a tuple of arguments (res,)
    # and an empty dict of keyword arguments
    q.put((display, (res,), {}))

def display(ans):
    print ('Sum of both two num is : %d ' % ans)

thrd = Thread(target=add)
thrd.start()

while True:  # a lightweight "event loop"
#    ans = q.get()
#    display(ans)
#    q.task_done()
    f, args, kwargs = q.get()
    f(*args, **kwargs)
    q.task_done()

コードを実行すると、結果は次のようになります

現在の結果

Enter 1st num : 5
Enter 2nd num : 6
Sum of both two num is : 11 

必要な結果

Enter 1st num : 5
Enter 2nd num : 6
Sum of both two num is : 11 

Enter 1st num : 8
Enter 2nd num : 2
Sum of both two num is : 10

Enter 1st num : 15
Enter 2nd num : 3
Sum of both two num is : 18

以下のように、毎回結果を印刷した後に入力を求める必要がある場所

4

2 に答える 2

11

displayすべての呼び出しをメインスレッドで実行したいようです。次の単純な例のように、 a を使用Queueしてメイン スレッドにメッセージを送信すると、うまくいくはずです。

from threading import Thread  # threading is better than the thread module
from Queue import Queue

q = Queue()  # use a queue to pass messages from the worker thread to the main thread

def add(num1,num2):
    res = num1 + num2
    q.put(res)  # send the answer to the main thread's queue

def display(ans):
    print ans

thrd = Thread(target=add, args=(2,5))
thrd.start()

while True:  # a lightweight "event loop"
    ans = q.get()
    display(ans)
    q.task_done()

この軽量の「メッセージング フレームワーク」の典型的な一般化は、ワーカー スレッドをプログラムして任意の関数と引数を に配置することqです。これにより、メインスレッドをより愚かにすることができます。q を扱うコードは次のようになります。

def add(num1,num2):
    res = num1 + num2
    # send the function 'display', a tuple of arguments (res,)
    # and an empty dict of keyword arguments
    q.put((display, (res,), {}))

# snip

while True:
    # now the main thread doesn't care what function it's executing.
    # previously it assumed it was sending the message to display().
    f, args, kwargs = q.get()
    f(*args, **kwargs)
    q.task_done()

ここから、堅牢で分離されたマルチスレッド アプリケーションを設計する方法を確認できます。すべてのワーカー スレッド オブジェクトに input を装備するQueueと、グローバルメディエータースレッドがスレッド間のメッセージのシャッフルを担当します。

Queueマルチスレッドへの に基づくアプローチでは、どのスレッドもグローバル オブジェクトを共有しないと仮定していることに注意してください。その場合、すべての共有オブジェクトにロックが関連付けられていることも確認する必要があります (ドキュメントを参照してthreadingください)。もちろん、これは、Queueベースのアプローチが回避しようとする困難な同期エラーの傾向があります。大変な作業のように見えますが、この話の教訓は、共有状態を最小限に抑えることです。

于 2012-12-07T13:23:39.587 に答える
0

ランデブー結界を仕掛けたいらしい

于 2014-05-09T08:57:23.947 に答える