我正在尝试使用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()
问题是当他们找到结果时如何停止所有线程?
答案 0 :(得分:1)
您尝试使用解决方案的主要问题是,因为您在gflag
内分配给doWork
,所以它是一个局部变量,而不是全局变量。要解决此问题,您需要在函数的开头添加global gflag
。
但即使你修复了它,它也无法解决你的问题。当您编写gflag=1
时,它不会更新存储在gflag
中的共享值,它只会将名称gflag
重新绑定到本地int 1
。您想使用gflag.value
。 (注意,一旦你解决了这个问题,之前的问题就会消失......但是对于人类读者来说,使用global
声明仍然会更好,即使编译器不需要它。)
最后,doWork
在完成所有工作之后才会实际检查该标志,因此该标志不会帮助您提前退出子进程。您可能希望将if
语句放在for
循环中,因此它会为每个元素检查一次标志,而不是仅在结尾处检查一次。