2016-12-15 105 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

我的問題是DO_OR_NOTfunction1這些修改都沒有得到體現在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