python多处理器如何在其中一个线程上找到结果时停止所有线程?

时间:2014-08-10 10:37:09

标签: python multithreading parallel-processing

我正在尝试使用python“从多处理导入Process,Value”模型并行运行我的代码。但是,我正在创建一个共享变量并将其用作标志,因此如果一个进程找到结果,它将设置将值标记为1并退出。其他进程应在标志值更改时退出,但由于某种原因,这些进程的标志值没有更改。这是代码:

from multiprocessing import Process, Value
gflag= Value('i',0)#this is the global flag shared between process
gflag=0
while True:                                                                                                                                                                      
    if not piece:                                                                                                                                                                  
        break                                                                                                                                                                      

    list1= piece.splitlines()                                                                                                                                                         

    p = Process(target=Dowork, args=(gflag,inValue,list1,var1,))                                                                                                                     

    p.start()                                                                                                                                                                      
    if(gflag==1):                                                                                                                                                                  
            exit()                                                                                                                                                                 

    piece = f.read(10000)

def doWork(gflag,inputvalue,diclist,var1):
    for p in diclist:
        calResult= doSomeCal(p,var1)
        if( calResult == inputvalue):
            gflag=1
            exit()

    if(gflag==1):
        print"exit now"
        exit()

问题是当他们找到结果时如何停止所有线程?

1 个答案:

答案 0 :(得分:1)

您尝试使用解决方案的主要问题是,因为您在gflag内分配给doWork,所以它是一个局部变量,而不是全局变量。要解决此问题,您需要在函数的开头添加global gflag

但即使你修复了它,它也无法解决你的问题。当您编写gflag=1时,它不会更新存储在gflag中的共享值,它只会将名称gflag重新绑定到本地int 1。您想使用gflag.value。 (注意,一旦你解决了这个问题,之前的问题就会消失......但是对于人类读者来说,使用global声明仍然会更好,即使编译器不需要它。)

最后,doWork在完成所有工作之后才会实际检查该标志,因此该标志不会帮助您提前退出子进程。您可能希望将if语句放在for循环中,因此它会为每个元素检查一次标志,而不是仅在结尾处检查一次。