文档警告此:
警告:如上所述,如果子进程已将项目放入队列中(并且未使用JoinableQueue.cancel_join_thread),则该进程将不会终止,直到所有缓冲的项目都已刷新到管道中为止。
这意味着,如果您尝试加入该进程,则可能会陷入僵局,除非您确定已放入队列中的所有项目都已消耗完。同样,如果子进程是非守护进程,则当父进程尝试加入其所有非守护进程子进程时,其父进程可能会在退出时挂起。
尽管aQueue
似乎是不受限制的,但在后台隐藏的情况下,已排队的项目在内存中进行了缓冲,以避免进程间管道过载。在刷新这些内存缓冲区之前,进程无法正常结束。你worker1()
放多了很多项目在 排队比你的worker2()
,而这一切就是这么简单。注意,在实现诉诸于内存缓冲之前可以排队的项目数量未定义:它在OS和Python版本之间可能会有所不同。
正如文档所建议的那样,避免这种情况的正常方法是 在 尝试处理 之前 将.get()
所有项目 从 队列中 移出 。正如您所发现的,是否有必 要这样做取决于未定义的方式,取决于每个工作进程将多少个项目放入队列中。