Python 如果子进程或工作进程在多重处理中出现异常,如何停止父进程?
我想实现两件事: 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) 我的预期结果是:[“工作!!!”,“工作!!!”,“工作!!!”,无,无]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
我的实际结果是:[“工作!!!”、“工作!!!”、“工作!!!”、“工作!!!”、“工作!!!”]你这里有几个问题。首先,您实际上不会引发异常,因此不会触发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
函数在进程之间传播异常。