【发布时间】:2022-01-08 19:03:13
【问题描述】:
我正在尝试使用多处理库在不使用池且不创建僵尸的情况下生成新进程。
在 Unix 上,当一个进程完成但尚未加入时,它变成一个 僵尸。永远不应该有很多,因为每次都有新的 进程开始(或调用
active_children())全部完成 尚未加入的进程将被加入。也叫 已完成进程的Process.is_alive将加入该进程。即使是这样 明确加入所有流程可能是一种好习惯 你开始吧。
这个实现是一个更大的脚本的一个简短版本,它会在几个小时后创建僵尸:
from multiprocessing import Process
import time
def target(task):
print(f"Working for {task*2} seconds ...")
time.sleep(task*2)
if __name__ == '__main__':
processes = 4
list_process = [None] * processes
targets = [[2] for i in range(10)]
list_process = [None] * processes
while targets:
for i in range(processes):
p = list_process[i]
if not (p and p.is_alive()):
list_process[i] = Process(target=target, args=(targets.pop(0)))
list_process[i].start()
if p:
p.join()
for process in list_process:
if process:
process.join()
在更大的版本中,list_process 只有僵尸,无法处理更多任务。
更新 1
感谢Booboo,我能够更好地了解正在发生的事情:
from multiprocessing import Process
import time
def target(task):
print(f"Working for {task*2} seconds ...")
time.sleep(task*2)
if __name__ == '__main__':
started_count = 0
joined_count = 0
joined_list = []
processes = 4
list_process = [None] * processes
targets = [[2] for i in range(10)]
list_process = [None] * processes
while targets:
for i in range(processes):
p = list_process[i]
if not (p and p.is_alive()):
list_process[i] = Process(target=target, args=(targets.pop(0)))
list_process[i].start()
print(list_process[i].pid)
started_count += 1
if p:
assert(not p.is_alive())
p.join()
joined_list.append(list_process[i].pid)
joined_count += 1
for process in list_process:
if process:
process.join()
joined_list.append(list_process[i].pid)
joined_count += 1
print(f'Final started count: {started_count}, final joined count: {joined_count}')
print(joined_list)
输出:
20604
24108
1272
23616
Working for 4 seconds ...
Working for 4 seconds ...
Working for 4 seconds ...
Working for 4 seconds ...
18492
17348
19992
6216
Working for 4 seconds ...
Working for 4 seconds ...
Working for 4 seconds ...
Working for 4 seconds ...
18744
26240
Working for 4 seconds ...
Working for 4 seconds ...
Final started count: 10, final joined count: 10
[18492, 17348, 19992, 6216, 18744, 26240, 6216, 6216, 6216, 6216]
我有 10 个进程已加入,但有些不是好的进程(pid 6216 尚未为任务调用,第一个未加入),导致未加入进程,为什么?
【问题讨论】:
-
有些进程不是
.join()导致僵尸进程(从提到的文档中简单推断)。由于同时处理的数量在列表list_process中具有最大值,因此并非所有任务都已完成。 -
我认为在
while-loop中,if p:之后,joined_list.append(list_process[i].pid)应该是joined_list.append(p.pid)?另外,恕我直言,您可能会遇到麻烦:pops 可能比targets中的元素多。
标签: python python-3.x multiprocessing python-multiprocessing zombie-process