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