有没有办法知道一个病毒/多处理工作者完成了?

时间:2018-02-28 16:24:25

标签: python multiprocessing pathos

我想知道工人何时完成,以便我可以释放资源作为任何工人的最后一次行动。或者我也可以在主要过程中释放这些资源,但是我需要在每个工作人员之后逐一释放这些资源(相比之下,在所有工人完成后将其释放一次)。

我按照以下方式运行我的工作人员,跟踪进度和使用的PID:

from pathos.multiprocessing import ProcessingPool
pool = ProcessingPool(num_workers)
pool.restart(force=True)
# Loading PIDs of workers with my get_pid() function:
pids = pool.map(get_pid, xrange(num_workers))  
try:
    results = pool.amap(
        exec_func,
        exec_args,
    )
    counter = 0
    while not results.ready():
        sleep(2)
        if counter % 60 == 0:
            log.info('Waiting for children running in pool.amap() with PIDs: {}'.format(pids))
        counter += 1
    results = results.get()
    # Attempting to close pool...
    pool.close()
    # The purpose of join() is to ensure that a child process has completed 
    # before the main process does anything.
    # Attempting to join pool...
    pool.join()
except:
    # Try to terminate the pool in case some worker PIDs still run:
    cls.hard_kill_pool(pids, pool)
    raise

由于负载平衡,很难知道哪个作业将成为工作者的最后一个。有没有办法知道有些工人已经不活动了?

我使用的是病毒版本0.2.0。

1 个答案:

答案 0 :(得分:2)

我是pathos作者。如果您需要在Pool中的每个工作人员完成运行后释放资源,我建议您不要使用PoolPool用于分配资源,并在完成所有作业之前继续使用它们。我建议使用一个生成Process的for循环,然后确保在完成后生成Process。如果您需要在pathos内执行此操作,则Process类位于名为pathos.helpers.mp.Process的地方(或更multiprocess.Process来自multiprocess )。