【发布时间】:2017-01-08 00:16:03
【问题描述】:
当目标函数抛出错误时,我试图退出多处理脚本,但父进程并没有退出,而是挂起。
这是我用来复制问题的测试脚本:
#!/usr/bin/python3.5
import time, multiprocessing as mp
def myWait(wait, resultQueue):
startedAt = time.strftime("%H:%M:%S", time.localtime())
time.sleep(wait)
endedAt = time.strftime("%H:%M:%S", time.localtime())
name = mp.current_process().name
resultQueue.put((name, wait, startedAt, endedAt))
# queue initialisation
resultQueue = mp.Queue()
# process creation arg: (process number, sleep time, queue)
proc = [
mp.Process(target=myWait, name = ' _One_', args=(2, resultQueue,)),
mp.Process(target=myWait, name = ' _Two_', args=(2, resultQueue,))
]
# starting processes
for p in proc:
p.start()
for p in proc:
p.join()
# print results
results = {}
for p in proc:
name, wait, startedAt, endedAt = resultQueue.get()
print('Process %s started at %s wait %s ended at %s' % (name, startedAt, wait, endedAt))
这很完美,我可以看到父脚本在htop 中生成了两个子进程,但是当我想强制父脚本退出时,如果在myWait 目标函数中抛出错误,父进程就会挂起并且甚至不会产生任何子进程。我必须ctrl-c 才能杀死它。
def myWait(wait, resultQueue):
try:
# do something wrong
except:
raise SystemExit
我已经尝试了各种退出函数的方法(例如exit()、sys.exit()、os._exit()...),但无济于事。
【问题讨论】:
标签: python multiprocessing python-3.5