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.

  1. After putting an object on an empty queue there may be an infinitesimal delay before the queue’s empty() method returns False and get_nowait() can return without raising queue.Empty.
  2. 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 异常。

解决方案

  1. 通过等待: 等待获取到的返回值的数量与命令数量一致再继续执行。
  2. 使用manager().Queue()

参考

  1. [python multiprocessing](

以上是关于python 多进程进程退不出问题的主要内容,如果未能解决你的问题,请参考以下文章

linux自启动脚本退不出

为啥centos7使用yum命令装不好软件,也退不出?

弹窗广告关不掉退不出 你的手机App里暗藏多少“牛皮癣”?

一直退不出 EFI SHELL,主板是ATOM MENLOW

python多进程数据库储存问题?

Python 多进程内存占用问题