gpt4 book ai didi

python - 管理和终止任何进程的可靠方法

转载 作者:太空狗 更新时间:2023-10-29 20:20:59 26 4
gpt4 key购买 nike

我正在编写代码来并行运行实验。我无法控制实验做什么,它们可能会打开使用 subprocess.Popencheck_output 来运行一个或多个额外的子进程。

我有两个条件:我希望能够终止超过超时的实验,并且我想在 KeyboardInterrupt 时终止实验。

大多数终止进程的方法并不能确保所有子进程等都被杀死。这显然是一个问题,如果 100 多个实验一个接一个地运行,但它们都会产生子进程,这些子进程在超时发生后仍然存活并且实验应该被终止。

我现在处理这个问题的方式是在数据库中包含存储实验配置的代码,生成从命令行加载和运行实验的代码,然后通过 subprocess.Popen(cmd, shell= True, start_new_session=True) 并在超时时使用 os.killpg 杀死它们。

然后我的主要问题是:通过命令行调用这些实验感觉很麻烦,那么有没有办法通过multiprocessing.Process(target=fn)直接调用代码并实现 start_new_session=True + os.killpg 超时和 KeyboardInterrupt 的相同效果?

<file1>
def run_exp(config):
do work
return result

if __name__ == "__main__":
save_exp(run_exp(load_config(sys.args)))

<file2>
def monitor(queue):
active = set() # active process ids
while True:
msg = queue.get()
if msg == "sentinel":
<loop over active ids and kill them with os.killpg>
else:
<add or remove id from active set>


def worker(args):
id, queue = args
command = f"python <file1> {id}"
with subprocess.Popen(command, shell=True, ..., start_new_session=True) as process:
try:
queue.put(f"start {process.pid}")
process.communicate(timeout=timeout)
except TimeoutExpired:
os.killpg(process.pid, signal.SIGINT) # send signal to the process group
process.communicate()
finally:
queue.put(f"done {process.pid}")

def main():
<save configs => c_ids>
queue = manager.Queue()
process = Process(target=monitor, args=(queue,))
process.start()

def clean_exit():
queue.put("sentinel")
<terminate pool and monitor process>

r = pool.map_async(worker, [(c_id, queue) for c_id in c_ids])
atexit.register(clean_exit)
r.wait()
<terminate pool and monitor process>

我发布了一个代码框架,详​​细说明了通过命令行启动进程并终止它们的方法。我的方法的那个版本的另一个复杂之处是,当 KeyboardInterrupt 到达时,队列已经终止(因为缺少更好的词)并且不可能与监视器进程通信(哨兵消息永远不会到达)。相反,我不得不求助于将进程 ID 写入文件并在主进程中读回文件以终止仍在运行的进程。如果您知道解决此队列问题的方法,我会很想了解它。

最佳答案

我认为问题是你正在存储子进程 pid 来杀死它你需要主机进程 pid,并且你使用了 signal.SIGINT 我认为应该是 signal.SIGTERM .试试这个,而不是这一行:

os.killpg(process.pid, signal.SIGINT)

使用这一行:

os.killpg(os.getpgid(process.pid), signal.SIGTERM) 

关于python - 管理和终止任何进程的可靠方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54522032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com