我希望并行执行任务,如果任务退出时有错误,那么所有进程都应该停止并退出。这是我的密码
import multiprocessing as mp
import time, os, subprocess, sys
def run_pipeline(value):
pid = os.getpid()
if value == 7:
print("Death process (%d) 7 starts ..." % pid)
r = subprocess.run('sleep 10', shell=True)
print("Death process (%d) 7 ends ..." % pid)
return value
start = time.perf_counter()
while time.perf_counter() < start + 100:
print('ProcessID: %s @ value %s' % (str(pid),str(value)),end='\n',flush=True)
r = subprocess.run('sleep 100', shell=True)
return value
if __name__ == '__main__':
# Run pipeline in parallel
with mp.Pool(8) as pool:
value = list(range(20))
for r in pool.imap_unordered(run_pipeline, value):
if r > 0:
print('killed %d' % r)
pool.terminate()
pool.close()
time.sleep(10) # time to check process list for only one Python process running
print('end of program')
break当任何小任务抛出错误时,此代码将退出。但是如果我使用top签入ubuntu终端,所有其他进程仍在执行,直到它们正常完成为止。根据python3文档,pool.terminate()应该“在未完成未完成的工作的情况下立即停止工作进程”(https://docs.python.org/3/library/multiprocessing.html)。
我不知道我的密码有什么问题。我的系统是16.04我的python是3.5.2
非常感谢!
编辑:
谢谢大家的答复。这有助于我更好地理解我的问题。我还完成了代码。我很抱歉问错了问题。实际上,pool.terminate()确实按照预期停止了池中的所有python子进程。但是,从我上面的代码中可以看出(编辑)。在每个python子流程中,调用子进程在bash中生成另一个子进程。显然,pool.terminate()没有停止任何这些bash进程(您可以使用pgrep "sleep"看到这些进程挂在那里直到结束,即使python全部消失了)。因此,我的问题应该是:“如果python子进程出错,有没有办法阻止这些bash进程?”
再次感谢您!
发布于 2021-01-20 23:55:22
这里有一个完整的程序,它演示了pool.terminate()工作正常,至少在我的Windows 10系统上是这样的。run_pipeline函数仅在工作value为7(我有8个处理器)时才返回,但一旦终止,它们都会停止:
import multiprocessing as mp
import time
def run_pipeline(value):
if value == 7:
time.sleep(.5)
return 7
start = time.perf_counter()
while time.perf_counter() < start + 10:
print(value,end=' ',flush=True)
time.sleep(.1)
if __name__ == '__main__':
# Run pipeline in parallel
with mp.Pool(8) as pool:
value = list(range(20))
for r in pool.imap_unordered(run_pipeline, value):
print(f'killed{r}')
pool.terminate()
time.sleep(10) # time to check process list for only one Python process running
break0 1 2 3 4 5 6 1 0 2 3 4 5 6 1 0 2 3 4 5 6 0 1 2 3 4 5 6 0 1 2 3 4 5 6 0 1 2 3 4 5 6 8 killed77个进程将永远运行,第8个进程得到一个"7“,并在500 are后返回结果。那个泳池工人从工作8开始,但是所有的泳池工人都停止了。任务管理器显示9个进程(主线程和8个池工作人员)直到terminate,然后只有主进程正在运行。
https://stackoverflow.com/questions/65818144
复制相似问题