Python:为什么进程在完成其 运行() 后仍保持活动状态
Python: Why would a Process stay alive even after it finished its run()
我有一个启动一组进程的多处理程序。这些程序的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 在调试一些多处理问题时非常方便。
我有一个启动一组进程的多处理程序。这些程序的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 在调试一些多处理问题时非常方便。