好消息:用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进程还在运行。在
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进程运行在
可能有帮助的事情:
目前没有回答
相关问题 更多 >
编程相关推荐