python-3.x 如何等待多个多进程.进程在执行exec()时完成执行?

kkbh8khc  于 2023-02-26  发布在  Python
关注(0)|答案(1)|浏览(189)

我需要等待多个进程完成执行,我使用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实际上会等待进程完成。

k3bvogb1

k3bvogb11#

没有魔法,我的印象是multiprocess.Process.sentinel是一个pidfd_open返回的文件描述符,我怀疑multiprocessing.Process打开了一个pipe()sentinel只是一个普通的管道,因为python在os.execv的时候关闭了管道,所以select()在上面只是立即返回,而且,今天我了解到subprocess.Popen.wait()(由multiprocessing.Process.join()调用)只是一个每500us调用waitpid的忙碌循环。
相反,使用subprocess.Popenpreexec_fn设置oom_score_adj。在主线程中执行threading.Event.wait(),并在SIGCHLD信号处理程序中设置事件,以通知主线程处理其中一个查尔兹。

相关问题