2017-04-05 3 views
0

私は、異なるモジュールのメソッドを実行している別のスレッドに渡すブール値を持っています。このブール値は取り消しトークンとして機能するので、スレッドが終了する必要があります。私は別のスレッドでそれを設定すると、他のスレッドでは変更されないので、値渡しと思われます。ありがとう。スレッドとモジュール間の参照でブール値を渡す方法

import module2 
from threading import Thread 

cancellationToken = False 

def main: 
    thread2 = Thread(target = module2.method2, args (on_input, cancellationToken,)) 
    thread2.start() 
    ... 
    thread2.join() 

def on_input(command): 
    global cancellationToken 
    ... 
    if(...): 
     cancellationToken = True 
    ... 

module2のmethod2は、キャンセルトークンをチェックしてユーザーの入力に応答する単純な無限ループです。

def method2(on_input, cancellationToken): 
    while(True): 
     if(cancellationToken): 
      return 
     ... 
     on_input(...) 
+0

シンプルなブールの場合は、 'Event'オブジェクトを使うことができます:https://docs.python.org/3.4/library/threading.html#event-objects –

答えて

2

あなたが行う場合は、この:

thread2 = Thread(target = module2.method2, args (on_input, cancellationToken,)) 

あなたは、本質的にスレッドのメソッドに第2引数の値Falseを渡しています。

しかし、あなたはそれの後に次の操作を行います。

cancellationToken = True 

あなたはcancellationTokenで表さ参照ではなく、もともとthread2に渡された値を置き換えます。

あなたが何をしたいのかを達成するために、あなたの取り消し状態のための可変オブジェクトラッパーを作成する必要がありますが:

class CancellationToken: 
    def __init__(self): 
     self.is_cancelled = False 

    def cancel(self): 
     self.is_cancelled = True 

cancellationToken = CancellationToken() 

thread2 = Thread(target = module2.method2, args (on_input, cancellationToken,)) 

# then later on 
cancellationToken.cancel() 

あなたのスレッドのコードは次のようになります。

def method2(on_input, cancellationToken): 
    while(True): 
     if(cancellationToken.is_cancelled): 
      return 
     ... 
     on_input(...) 
関連する問題