繁体   English   中英

Python多重处理-将新功能分配给完成的过程吗?

[英]Python multiprocessing - Allocate a new function to a finished process?

我有800个要并行处理的图像文件的列表。 假设我将其名称存储在这样的列表中:

lis_fnames = ['im1.jpg','im2.jpg',...']

然后,我导入多处理模块,并从中导入Pool。 我给每个线程一个名为'run_cli'的函数,该函数接受文件名。

到目前为止,我运行以下代码:

def run_pool():
    pool = Pool(processes=4)
    pool.map(run_cli, ['im1.jpg','im2.jpg','im3.jpg','im4.jpg'])

并在迭代完成后手动更改文件名。 我的问题是:

问:给定四个进程,如果一个进程已完成,如何自动为它提供'run_cli'函数和另一个文件名(来自lis_fnames列表)以供分析,而不必等待所有四个进程完成,然后手动再次运行它?

您应该将其留给游泳池。 无需将可迭代对象手动拆分为合适的块。 只需映射所有内容,只要列表中还有剩余项目,Pool就会继续为您的工人提供更多工作。

这是一个简单但可行的示例。 它还显示了两种可能的结果处理方式。 它执行回调并解析结果对象。 当然,您将只执行其中之一-如果您不关心工人的返回值,则不执行任何操作。

import multiprocessing    
from time import sleep
import random

def completed(x):
    print("Done {}".format(x))

def worker(x):
    sleep(x)
    print("Worker completed {}".format(x))
    return(x)

p = multiprocessing.Pool(processes=4)

tasks = [random.randint(0,5) for _ in range(0,20)]

results = p.map_async(worker, tasks, callback=completed)

p.close()
p.join()
for r in results.get():
    print(r)

这将生成一个“任务”列表,在这种情况下,只是一个随机数列表。 Worker通过休眠作为参数发送的秒数来模拟工作。 您可以看到工作人员完成了,最后,当所有工作人员都完成后,您将获得“结果”。

总是有四个并行的工作人员处于活动状态,但是任务列表不止于此。 游泳池能够照顾到这一点。

暂无
暂无

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

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