从文档:加入使用队列的进程请记住,将项目放入队列的进程将在终止之前等待,直到所有缓冲的项目由“feeder”线程提供给底层管道 . (子进程可以调用队列的Queue.cancel_join_thread方法来避免这种行为 . )这意味着无论何时使用队列,您都需要确保在进程之前最终删除所有已放入队列的项目加入了 . 否则,您无法确定已将项目放入队列的进程将终止 . 还要记住,非守护进程会自动加入 .
当我解读时,一个进程,这里是p2 = jobHandler,不应该在将项放入队列后立即退出,以避免排队的数据松散 . 找不到任何句子的解释否则你不能......已经把队列上的物品都终止了 .
除此之外,我想评论你的代码 . 我认识到这个代码已经简化了 .
避免将启动时执行的代码放在 if __name__ == '__main__': 之外
从文档:安全导入主模块一个应该使用if name =='main'来保护程序的“入口点”:
job_queue = mp.Queue() error_queue = mp.Queue() for i in range(10): job_queue.put(i)
在def job_handler / error_handler中
.close()
except: ... job_queue.close()
这是错误的,因为job_handler进程永远不会将消息放在此队列中 .
这也适用于进程error_handler和error_queue.close()
从文档:指示当前进程不再向此队列放置任何数据 . 一旦将所有缓冲数据刷新到管道,后台线程将退出 . 当队列被垃圾收集时,会自动调用此方法 .
_foun_handler / error_handler中的
.join_thread()
这没用,因为job_handler进程不会在此队列上放置消息 . 因此 .join_thread 确实 nothing . 对于进程error_handler也是如此 .
except: ... job_queue.join_thread()
# t2
def error_handler(error_queue): ... error_queue.close() error_queue.join_thread()
使用 Exit(1) 而不是 return 1
无法使用 p2.exitcode. 捕获错误代码'1'
将一个过程想象成一个自己的程序而不是一个函数 .
return 1
请尝试以下方法:
# t1
error_queue.put('Error')
error_queue.close()
# Give the error_handler a chance to get a timeslice
time.sleep(0.2)
error_queue.join_thread()
#job_queue.close()
#job_queue.join_thread()
# t2
exit(1)
Tested with Python:3.4.2 and Python:2.7.9