我在做一个复杂模拟的参数优化。采用多处理模块提高了优化算法的性能。我在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循环for p in procs:此外,如果所有进程都不超过5秒,则程序不得等待这5秒。

最佳答案

您可以通过创建一个循环来实现这一点,该循环将等待一定的超时时间(秒),并经常检查所有进程是否都已完成。如果它们没有在分配的时间内全部完成,则终止所有进程:

TIMEOUT = 5
start = time.time()
while time.time() - start <= TIMEOUT:
    if any(p.is_alive() for p in procs):
        time.sleep(.1)  # Just to avoid hogging the CPU
    else:
        # All the processes are done, break now.
        break
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 - Python多处理模块:使用超时连接进程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26063877/

10-13 09:05