python 多进程进程退不出问题
Posted 紫无之紫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 多进程进程退不出问题相关的知识,希望对你有一定的参考价值。
python 多进程在程序结束时退不出问题
最近在写python脚本时遇到脚本进程退不出问题,这边记录一下原因。
原因
自己通过multiprocessing的队列实现了进程池,一个JoinableQueue
用来存放并行执行的命令,多个进程从JoinableQueue
中获取要执行的命令;一个Queue
用来存放执行结果。
问题出在从Queue中获取执行结果(通过get(False)非阻塞获取),结果有可能获取不到(get 抛出Empty异常),导致队列中数据没有被消费掉,然后导致进程停不掉。
对这个情况在官方文档中有说明:
Note
When an object is put on a queue, the object is pickled and a background thread later flushes the pickled data to an underlying pipe. This has some consequences which are a little surprising, but should not cause any practical difficulties – if they really bother you then you can instead use a queue created with a manager.
- After putting an object on an empty queue there may be an infinitesimal delay before the queue’s
empty()
method returnsFalse
andget_nowait()
can return without raisingqueue.Empty
.- If multiple processes are enqueuing objects, it is possible for the objects to be received at the other end out-of-order. However, objects enqueued by the same process will always be in the expected order with respect to each other.
其中第一条说明,在把一个对象放到空队列后,这里也许会有一个极小的延迟, 在这个延迟没结束前,empty() 会返回Fasle,get_nowait() 也即 get(False) 会 抛出queue.Empty 异常。
解决方案
- 通过等待: 等待获取到的返回值的数量与命令数量一致再继续执行。
- 使用manager().Queue()
参考
- [python multiprocessing](
以上是关于python 多进程进程退不出问题的主要内容,如果未能解决你的问题,请参考以下文章