繁体   English   中英

如何将特定数量的额外工作人员添加到现有的多处理池中?

[英]how to add specific number of additional workers to an exisiting multiprocessing pool?

在以下情况下,我创建了一个包含两个工作人员的默认池并执行任务。 在任务处理期间,task_queue 会被定期检查,因此它不会超过一定的长度限制并防止上游/下游混乱。 如何动态添加更多工作人员以减少任务队列长度?

import multiprocessing as mp

... code snippet...

def main(poolsize, start_process):

    pool = mp.Pool(processes=poolsize, initializer=start_process)
    done = False

    task_queue = []

    while True:

        ... snippet code : do something ...

        if len(task_queue) >= 10:

            ... code to expand pool goes here...

        if done == True:
            break

    .. do final something ...

if __name__ == '__main__':

#    freeze_support()

    poolsize = 2

    main(poolsize)

要在运行池处理作业期间添加更多工作人员,您可以在 while 循环中添加以下函数:


def repopulate(pool, add_workers):

    current_pool_size = len(pool._pool)         # _.pool gets the current pool size.

    new_pool_size = current_pool_size + add_workers

    pool._processes = new_pool_size

    pool._repopulate_pool()

    return pool

main()的 while 循环中:


if len(task_queue) >= 10:

    new_workers = 2

    repopulate(poolname, new_workers)

multiprocessing.Pool具有动态大小

基于 ZF007 答案的完整示例

import multiprocessing, time, random

def worker_function(job_id):
    dt = random.randint(1, 10)
    print(f"job {job_id}: sleeping for {dt} seconds")
    time.sleep(dt)
    return job_id * job_id

def get_job_done(job_id):
    return lambda val: print(f"job {job_id}: job done: val={val}")

def grow_pool(pool, new_size, max_size=None):
    new_size = min(new_size, max_size) if max_size else new_size
    if new_size > pool._processes:
        print(f"growing pool from {pool._processes} to {new_size}")
        pool._processes = new_size
        pool._repopulate_pool()

if __name__ == "__main__":

    # start pool
    start_workers = 1 # start N workers before demand
    max_workers = 4 # run N workers on demand
    pool = multiprocessing.Pool(start_workers)

    # add jobs
    num_jobs = 10
    grow_pool(pool, num_jobs, max_workers)
    for job_id in range(0, num_jobs):
        job_done = get_job_done(job_id)
        print(f"job {job_id}: adding job")
        pool.apply_async(worker_function, args=(job_id,), callback=job_done)

    # wait
    pool.close()
    pool.join()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM