我需要等待多个进程完成执行,我使用multiprocess.process,因为我想在执行它们之前调整子进程的oom分数,经过研究,我想使用multiprocessing. connection. wait和子进程的sentinel值来等待它们。
请看下面的代码:
import multiprocessing
import multiprocessing.connection
import os
from datetime import datetime
def adj_oom_score_exec(*command: str):
with open("/proc/{}/oom_score_adj".format(os.getpid()), "w") as f:
f.write("500")
os.execv(command[0], command)
exit(198)
pp = multiprocessing.Process(target=adj_oom_score_exec, args=["/usr/bin/sleep", "1"])
pp.start()
print(datetime.now())
multiprocessing.connection.wait([pp.sentinel])
print(datetime.now())
这段代码输出了两个时间戳,它们之间的差别是毫秒。multiprocessing.connection.wait()
不等待命令完成执行。如何让它等待?注意pp.join()
确实可以工作,而且因为subprocess不是守护进程,Python实际上会等待进程完成。
1条答案
按热度按时间k3bvogb11#
没有魔法,我的印象是
multiprocess.Process.sentinel
是一个pidfd_open
返回的文件描述符,我怀疑multiprocessing.Process
打开了一个pipe()
,sentinel
只是一个普通的管道,因为python在os.execv
的时候关闭了管道,所以select()
在上面只是立即返回,而且,今天我了解到subprocess.Popen.wait()
(由multiprocessing.Process.join()
调用)只是一个每500us调用waitpid
的忙碌循环。相反,使用
subprocess.Popen
和preexec_fn
设置oom_score_adj。在主线程中执行threading.Event.wait()
,并在SIGCHLD信号处理程序中设置事件,以通知主线程处理其中一个查尔兹。