这个问题似乎一直在回避我--所有的解决方案都更像是解决方案,并且给代码增加了相当多的复杂性。既然这方面的帖子已经发布了很长时间,那么有什么simple解决方案可以解决以下问题--在检测到键盘中断后,干净地退出所有的儿童进程,终止程序?
下面的代码是我的多进程结构的代码片段--我想在添加所需功能的同时保留尽可能多的可执行性:
from multiprocessing import Pool
import time
def multiprocess_init(l):
global lock
lock = l
def synchronous_print(i):
with lock:
print i
time.sleep(1)
if __name__ == '__main__':
lock = Lock()
pool = Pool(processes=5, initializer=multiprocess_init, initargs=(lock, ))
for i in range(1,20):
pool.map_async(synchronous_print, [i])
pool.close() #necessary to prevent zombies
pool.join() #wait for all processes to finish发布于 2015-12-26 19:39:19
简单的回答是移到python3.Python 2中,在python 3中已经解决了线程/进程同步的多个问题。
在您的情况下,每次发送键盘中断时,multiprocessing都会顽强地重新创建您的子进程,pool.close就会卡住,永远不会退出。您可以通过使用os.exit显式退出子进程并等待来自apply_async的单个结果来减少问题,这样您就不会陷入pool.close监狱。
from multiprocessing import Pool, Lock
import time
import os
def multiprocess_init(l):
global lock
lock = l
print("initialized child")
def synchronous_print(i):
try:
with lock:
print i
time.sleep(1)
except KeyboardInterrupt:
print("exit child")
os.exit(2)
if __name__ == '__main__':
lock = Lock()
pool = Pool(processes=5, initializer=multiprocess_init, initargs=(lock, ))
results = []
for i in range(1,20):
results.append(pool.map_async(synchronous_print, [i]))
for result in results:
print('wait result')
result.wait()
pool.close() #necessary to prevent zombies
pool.join() #wait for all processes to finish
print("Join completes")https://stackoverflow.com/questions/34473069
复制相似问题