首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python3 multiprocess.pool.terminate()不会杀死进程

python3 multiprocess.pool.terminate()不会杀死进程
EN

Stack Overflow用户
提问于 2021-01-20 21:46:04
回答 1查看 496关注 0票数 1

我希望并行执行任务,如果任务退出时有错误,那么所有进程都应该停止并退出。这是我的密码

代码语言:javascript
复制
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进程?”

再次感谢您!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-20 23:55:22

这里有一个完整的程序,它演示了pool.terminate()工作正常,至少在我的Windows 10系统上是这样的。run_pipeline函数仅在工作value为7(我有8个处理器)时才返回,但一旦终止,它们都会停止:

代码语言:javascript
复制
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
            break
代码语言:javascript
复制
0 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 killed7

7个进程将永远运行,第8个进程得到一个"7“,并在500 are后返回结果。那个泳池工人从工作8开始,但是所有的泳池工人都停止了。任务管理器显示9个进程(主线程和8个池工作人员)直到terminate,然后只有主进程正在运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65818144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档