我们注意到在我们的一个部署中遗留了一堆已失效的(僵尸)进程,并设法生成了一个显示问题的非常小的程序:
多.py:
from multiprocessing import Pool, set_start_method
def f(x):
return x*x
if __name__ == '__main__':
set_start_method('spawn')
with Pool(5) as p:
print(p.map(f, [1, 2, 3]))
p.close()
p.join()
Run Code Online (Sandbox Code Playgroud)
该程序似乎正在离开僵尸进程,但很难捕获,因为从常规 shell 运行它会导致 shell 收割僵尸进程。
在我们的部署中,我们从另一个 python 程序运行它,所以为了模拟它,我们有这个:
主要.py:
from subprocess import run
from time import sleep
while True:
result = run(["python", "multi.py"], capture_output=True)
print(result.stdout.decode('utf-8'))
result = run(["ps", "-ef", "--forest"], capture_output=True)
print(result.stdout.decode('utf-8'), flush=True)
sleep(1)
Run Code Online (Sandbox Code Playgroud)
运行main.py会产生以下输出:
[1, 4, 9]
UID PID PPID C STIME TTY TIME CMD
root 1 0 11 …Run Code Online (Sandbox Code Playgroud)