2016-12-15 21 views
0

私のプロジェクトには以下の構造があります。スレッド内のグローバル変数

file1.py

def run_tasks_threads(): 
    task1 = threading.Thread(target=do_task_1) 
    task1.start() 
    ... 

from file2 import DO_OR_NOT 

def do_task_1(): 
    while True: 
     print DO_OR_NOT 
     if DO_OR_NOT: 
      # do something 

file2.py

DO_OR_NOT = True 

def function1: 
    global DO_OR_NOT 
    # modify DO_OR_NOT 

run_tasks_threadsさらに別のファイルから呼び出されます。そして、このコードのように、それは始まりtask1

私の問題はfunction1からDO_OR_NOTの変更はtask1()

注記に反映取得されていないことをされています。これは実際に私のDjangoのサーバーの一部です。
function1が複数回呼び出されます。

+0

イベントを使用しましたか?彼らはこの問題に非常に適しています – Jalo

+0

@Jalo、いいえいくつかのリンクを提供していただけますか? –

+0

@Jalo 'signals'を使うのですか? –

答えて

0

クラスthreading.Event()は、スレッド間でブールフラグを設定、クリア、および取得するためのインターフェイスを提供します。 file1.pyで

、イベント変数は、スレッドを作成する関数に渡される必要があり、その後、目標関数に最後に

def run_tasks_threads(my_event): 
    task1 = threading.Thread(target=do_task_1, args=(my_event,) 
    task1.start() 

def do_task_1(my_event): 
    while True: 
     print my_event.is_set() 
     if my_event.is_set(): 
      # do something 

、以前の機能を呼び出すメインスクリプトにfunction1に電話するたびにイベントを更新する必要があります。

def main(): 
    #Create an instance of the event class 
    my_event = threading.Event() 
    file1.run_tasks_threads(my_event) 
    while True 
     global DO_OR_NOT 
     #Get the bool value 
     file2.function1() 
     #Update the event flag depending on the boolean value 
     if DO_OR_NOT: 
      my_event.set() 
     else: 
      my_event.clear() 
+0

私のプロジェクトに' main'スクリプトがあるのは難しいです。 –

+0

@ JithinPavithran file1とfile2を呼び出すスクリプトでこのコードを使用する必要があります。これらの呼び出しが同じ親プロセスの一部である場合、共通の名前空間が必要です。前にも述べましたが、file1とfile2が別のプロセスから呼び出された場合、私のソリューションを使用することはできません。問題はより複雑になります。 – Jalo

+0

@JithinPavithran私が尋ねようとしているのは、url.pyが含まれているスクリプトビューの機能、またはそれらが共通の親スクリプトに属している場合は、 – Jalo

関連する問題