2017-10-13 5 views
0

私は主な呼び出しのバックグラウンドスレッドを持っています、バックグラウンドスレッドはさまざまなスクリプトを開くことができますが、時々このような無限の印刷ループを取得します。 thing.py 輸入fooの(意図的な)無限ループを残すスレッドを取得しますか?

def main(): 
    thr = Thread(target=background) 
    thr.start() 
    thread_list.append(thr) 

def background(): 
    getattr(foo, 'bar')() 
    return 

そしてfoo.py

def bar(): 
    while True: 
     print("stuff") 

にこれは、行うことになっているものですが、私は私がする必要がある場合はそれを殺すことができるようにしたいです。バックグラウンドスレッドとそれが呼び出すすべての関数を削除する方法はありますか?私はbackgroundにフラグを置いて、フラグがハイになったときに戻るようにしましたが、barが返るのを待ってから、backgroundは決してフラグをチェックすることができません。

編集:私はそれを編集して躊躇してるので、foo.pyは、理想的には、私はすべてのその大丈夫

+0

[Pythonでループスレッドを停止するにはどうすればいいですか?](https://stackoverflow.com/questions/18018033/how-to-stop-a-looping-thread-in-python) – harandk

答えて

1

まず、それは非常にある避けるためにfoo.pyを変更することなく、しかし、その不可能な場合は、これを行うことができ、私のコードではありませんどの言語を使用していても、(可能であれば)他のスレッドからスレッドを制御するのは困難です。これは潜在的なセキュリティの問題によるものです。つまり、両方のスレッドが自由にアクセスできる共有オブジェクトを作成することです。あなたはそれにフラグを設定することができます。 Pythonで

しかし幸いにも、各スレッドは、我々が使用することができ、独自のThreadオブジェクトがあります。

import foo 

def main(): 
    thr = Thread(target=background) 
    thr.exit_requested = False 
    thr.start() 
    thread_list.append(thr) 

def background(): 
    getattr(foo, 'bar')() 
    return 

そして、fooの中を:

import threading 

def bar(): 
    th = threading.current_thread() 
    # What happens when bar() is called from the main thread? 
    # The commented code is not thread safe. 
    # if not hasattr(th, 'exit_requested'): 
    #  th.exit_requested = False 
    while not th.exit_requested: 
     print("stuff") 

これはおそらく/デバッグを維持することは難しいでしょうが。もっとハックのように扱う。より洗練された方法は、共有オブジェクトを作成し、すべての呼び出しに渡すことです。

+0

ありがとうございました。 thread.current_thread()がどこから来たのか、thr.exit_requestedを別のファイルに渡す方法について説明していますか?私はこのコードを実装しようとしましたが、それはうまく動作しません。 – Indigo

+0

@Indigo私の悪い、それはタイプミスでした。コードを更新しました( 'import threading'が必要です)。また、 'exit_requested'は' main'に設定されています。 – freakish

関連する問題