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

2024-10-03 15:26:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用python“from multiprocessing import 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()

问题是如何停止所有的线程时,对他们发现的结果?你知道吗


Tags: 代码fromimportpieceif进程value标志
1条回答
网友
1楼 · 发布于 2024-10-03 15:26:08

您尝试的解决方案的主要问题是,因为您将赋值给gflag内的doWork,所以它是局部变量,而不是全局变量。要解决这个问题,需要在函数的开头添加global gflag。你知道吗

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

最后,doWork在完成所有工作之前不会检查标志,因此标志不能帮助您更早地退出子进程。您可能希望将if语句放在for循环中,因此它会对每个元素检查一次标志,而不是只在末尾检查一次。你知道吗

相关问题 更多 >