Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果子进程或工作进程在多重处理中出现异常,如何停止父进程?_Python_Multithreading_Multiprocessing - Fatal编程技术网

Python 如果子进程或工作进程在多重处理中出现异常,如何停止父进程?

Python 如果子进程或工作进程在多重处理中出现异常,如何停止父进程?,python,multithreading,multiprocessing,Python,Multithreading,Multiprocessing,我想实现两件事: 1) 使父对象保持活动状态,直到子对象/工作对象完成并 2) 如果子级/工作进程发生异常,则父级应在该异常之后停止。异常发生后,它不应运行剩余的工作进程 我已经写了一个代码,但无法得到我要找的 def等待时间(ds,索引): 尝试: 如果索引==3: 指数=15 ds[index]=“工作正常!!!” 除: 全局异常 isException=True 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': isException=False ds

我想实现两件事: 1) 使父对象保持活动状态,直到子对象/工作对象完成并 2) 如果子级/工作进程发生异常,则父级应在该异常之后停止。异常发生后,它不应运行剩余的工作进程

我已经写了一个代码,但无法得到我要找的

def等待时间(ds,索引): 尝试: 如果索引==3: 指数=15 ds[index]=“工作正常!!!” 除: 全局异常 isException=True 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': isException=False ds=multiprocessing.Manager().list([None]*5) 新=[] 对于范围(1,len(ds)+1)内的i: temp=多处理。进程(目标=等待时间,参数=(ds,i-1)) 新增。追加(临时) 临时启动() 临时联接() 如果是异常: 打破 打印(ds) 我的预期结果是:[“工作!!!”,“工作!!!”,“工作!!!”,无,无]


我的实际结果是:[“工作!!!”、“工作!!!”、“工作!!!”、“工作!!!”、“工作!!!”]

你这里有几个问题。首先,您实际上不会引发异常,因此不会触发worker中的exception子句。第二,全局变量不会在流程之间传递-您需要另一个管理器来实现这一点

考虑这一点:

def waitTime(ds, isException, index):
    try:
        if index == 3:
            index = 15
            raise IndexError
        ds[index] = 'WORKED!!!'
    except IndexError:
        isException.value = 1


if __name__ == '__main__':
    isException = multiprocessing.Manager().Value("h", 0)
    ds = multiprocessing.Manager().list([None]*5)
    new = []
    for i in range(1, len(ds)+1):
        temp = multiprocessing.Process(target=waitTime, args=(ds, isException, i-1))
        new.append(temp)
        temp.start()
        temp.join()
        if isException.value == 1:
            break

    print(ds)

现在我们创建一个索引器并捕获它。您的
isException
现在是另一个用于在进程之间传递值的管理器。它不一定非常优雅,但很管用

全局变量不是在多进程之间共享的,而是在线程中共享的。您必须使用多进程模块提供的值、队列、锁

import multiprocessing
from multiprocessing import Value

v = Value('i', 0) # where i means integer type, 0 is default value


def waitTime(ds, index):
    try:
        if index == 3:
            index = 15
        ds[index] = 'WORKED!!!'
    except:
        v.value = 1 # v.value to assign integer


if __name__ == '__main__':
    isException = False
    ds = multiprocessing.Manager().list([None] * 5)
    new = []
    for i in range(1, len(ds) + 1):

       temp = multiprocessing.Process(target=waitTime, args=(ds, i - 1))
       new.append(temp)
       temp.start()
       temp.join()
       if v.value == 1:
           v.value = 0
           break

output:
['WORKED!!!', 'WORKED!!!', 'WORKED!!!', None, None]

我认为应该注意的是,虽然这(像OP的代码)使用多个进程,但实际上很少发生并发处理。正如现在所写的,最好完全删除多处理,结果将完全相同。我假设这是一个存根,用来突出一个问题或学校作业,其中的任务是做一些毫无意义的事情来演示多处理的知识。在更现实的场景中,可以使用可选的
error\u callback
函数在进程之间传播异常。