gpt4 book ai didi

Python 多处理模块 : join processes with timeout

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

我正在对复杂模拟的参数进行优化。我正在使用多处理模块来增强优化算法的性能。我在 http://pymotw.com/2/multiprocessing/basics.html 学到的多处理基础知识.根据优化算法的给定参数,复杂模拟持续不同的时间,大约 1 到 5 分钟。如果参数选择得非常糟糕,模拟可能会持续 30 分钟或更长时间,结果也没有用。所以我在考虑为多处理建立超时,终止所有持续时间超过定义时间的模拟。这是问题的抽象版本:

import numpy as np
import time
import multiprocessing

def worker(num):

time.sleep(np.random.random()*20)

def main():

pnum = 10

procs = []
for i in range(pnum):
p = multiprocessing.Process(target=worker, args=(i,), name = ('process_' + str(i+1)))
procs.append(p)
p.start()
print('starting', p.name)

for p in procs:
p.join(5)
print('stopping', p.name)

if __name__ == "__main__":
main()

p.join(5) 行定义了 5 秒的超时。由于 for-loop for p in procs: 程序等待 5 秒,直到第一个进程完成,然后再等待 5 秒,直到第二个进程完成,依此类推,但我希望程序终止所有持续时间超过 5 秒的进程。此外,如果所有进程的持续时间都不超过 5 秒,则程序不得等待这 5 秒。

最佳答案

您可以通过创建一个循环来完成此操作,该循环将等待一些超时秒数,并经常检查是否所有进程都已完成。如果它们没有在规定的时间内全部完成,则终止所有进程:

TIMEOUT = 5 
start = time.time()
while time.time() - start <= TIMEOUT:
if not any(p.is_alive() for p in procs):
# All the processes are done, break now.
break

time.sleep(.1) # Just to avoid hogging the CPU
else:
# We only enter this if we didn't 'break' above.
print("timed out, killing all processes")
for p in procs:
p.terminate()
p.join()

关于Python 多处理模块 : join processes with timeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26063877/

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