无法使用mpirun和多处理捕获ctrlc

2024-04-20 12:56:41 发布

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

好消息:用python3 test.py运行这个程序,然后按ctrl-c。它会自动停止

坏消息:用mpirun -n 1 python3 test.py按ctrl-c.Ops运行,mpirun终止,但是多处理.pool永远活着。怎么解决这个问题?在

在测试.py公司名称:

from mpi4py import MPI
import multiprocessing as mp
import signal
import time

class GracefulKiller:
    kill_now = False

    def __init__(self):
        signal.signal(signal.SIGINT, self.exit_gracefully)
        signal.signal(signal.SIGTERM, self.exit_gracefully)
    def exit_gracefully(self, signum, frame):
        self.kill_now = True
        print("I kill")

def worker(e):
    killer = GracefulKiller()
    while(True):
        if killer.kill_now:
            e.set()
        if e.is_set():
            return

def main():
    comm = MPI.COMM_WORLD
    rank = comm.Get_rank()
    size = comm.Get_size()

    killer = GracefulKiller()
    with mp.Manager() as manager:
        e = manager.Event()
        pool = mp.Pool()
        arg = []
        for i in range(100):
            arg += [e]
        r = pool.map_async(worker, arg)
        r.get()
        pool.join()
        pool.close()
        if killer.kill_now:
            e.set()
        if e.is_set():
            comm.Abort()

main()

GracefulKiller来自How to process SIGTERM signal gracefully?

mpirun来自openmpi。我在Ubuntu和CentOS上进行了测试。在


更新:

  • 我添加了一行print("I kill")。然后我用ctrl-C再次尝试mpirun。它只打印一次I kill,但仍有一堆{}进程仍在运行。在

更新2:

  • 给优雅杀手加了个名字
  • 添加了pool.terminate()以尝试在主进程捕获ctrl-c时终止主进程的pool生成的所有进程

在测试.py公司名称:

^{pr2}$
  • Python3测试.py(然后按ctrl-c键):

一堆python3进程还在运行。在

I kill. worker/main ...
...
  File "test.py", line 20, in exit_gracefully
    self.pool.terminate()
  File "/usr/lib/python3.5/multiprocessing/pool.py", line 505, in terminate
    self._terminate()
  File "/usr/lib/python3.5/multiprocessing/util.py", line 186, in __call__
    res = self._callback(*self._args, **self._kwargs)
  File "/usr/lib/python3.5/multiprocessing/pool.py", line 535, in _terminate_pool
...
I kill. worker/main ...
  • mpirun-n 1Python3测试.py(然后按ctrl-c键): . 在

    prints nothing和一堆python3进程运行在


可能有帮助的事情:

Python multiprocessing: Kill worker on exit


Tags: inpyselfsignal进程exitmultiprocessingpython3