Python:为什么进程在完成 run() 后仍保持事件状态

标签 python python-2.7 multiprocessing python-multiprocessing

我有一个启动了一组进程的多处理程序。这些程序的 run() 部分如下所示:

def run(self):
    self.prep()
    self._prn('Started with PID {pid}'.format(pid=self.pid))
    while True:
        job = self._queue.get()
        if job is None: break
        self.do_work(**job)
    self._prn('Received spindown signal.')

(_prn 方法只是在前面加上进程的名称,如下所示:)

def _prn(self, *args, **kwargs):
    print('{nam}({pid}):'.format(nam=self.name, pid=self.pid), end='')
    print(*args, **kwargs)

作业参数是通过将字典插入队列来发送的。

因此,完成后,我将几个 None 放入队列中,我看到 Process-es 全部打印出 Received spindown signal。

但是,由于莫名其妙的原因,即使我看到进程发出了 Received spindown signal 消息,它们仍然保持事件状态! (也就是说,他们的 .is_alive() 方法不断返回 True)

这是我正在使用的轮询代码:

while len(workers) > 0:
    still_alives = []
    for w in workers:
        if w.is_alive():
            still_alives.append(w)
        else:
            prn('    {nam} trying to join...'.format(nam=w.name))
            w.join()
            prn('    {nam} joined.'.format(nam=w.name))
    prn('  Still alive:', ' '.join((w.name for w in still_alives)))
    workers = still_alives
    time.sleep(10)

这是我看到的输出的摘录:

Main:  Still alive: Querier-0 Querier-2 Querier-3 Querier-4 Querier-6 Querier-7 Querier-9 Querier-10
Querier-9:Received spindown signal.
Querier-4:Received spindown signal.
Main::    Querier-4 trying to join...
Main::    Querier-4 joined.
Main::    Querier-9 trying to join...
Main::    Querier-9 joined.
Main::  Still alive: Querier-0 Querier-2 Querier-3 Querier-6 Querier-7 Querier-10
Querier-3:Received spindown signal.
Querier-10:Received spindown signal.
Querier-6:Received spindown signal.
Main::  Still alive: Querier-0 Querier-2 Querier-3 Querier-6 Querier-7 Querier-10
Main::  Still alive: Querier-0 Querier-2 Querier-3 Querier-6 Querier-7 Querier-10
Querier-0:Received spindown signal.
Main::  Still alive: Querier-0 Querier-2 Querier-3 Querier-6 Querier-7 Querier-10
Main::  Still alive: Querier-0 Querier-2 Querier-3 Querier-6 Querier-7 Querier-10

如您所见,Querier-4-9 正常死亡。但Querier-3-10-6-0从未消亡!

这是怎么回事?

最佳答案

尝试从两侧检查队列;如果它不为空,则进程不会终止。

另外,我发现了这个link在调试一些多处理问题时非常方便。

关于Python:为什么进程在完成 run() 后仍保持事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35473437/

相关文章:

python - 使用 PostgreSQL 时如何将变量插入 python

python - python 中的函数参数

python-2.7 - 排序字典列表值

python - 在 Python 中获取繁忙的 CPU 数量

Python 2.7 多重处理 - 无法通过管理器字典传递套接字对象

python - 将值传递给我的 Python 脚本的 procmal 配方

python-2.7 - Scrapy::转储到 json 文件时出现编码问题

python - sh : Rscript: command not found

python - multiprocessing.cpu_count 和 os.cpu_count 的区别

python - 当 pandas 是导入时,Cx_freeze TypeError 只能使用 numpy 依赖项连接列表(不是 "NoneType")来列出