Python多处理 - 为完成的进程分配新函数?

时间:2018-03-23 09:36:24

标签: python subprocess python-multiprocessing python-multithreading parallel-python

我有一个800个图像文件的列表,我想并行处理。假设我将他们的名字存储在一个列表中:

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

然后我导入多处理模块并从中导入池。我给每个线程一个名为' 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列表)供它分析,而不必等待所有四个进程完成,然后再手动运行它?

1 个答案:

答案 0 :(得分:2)

你应该把它留在游泳池里。无需手动将可迭代分割为合适的块。只需将地图全部映射,只要列表中有剩余项目,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)

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

总有四个并行工作者处于活动状态,但任务列表超出了此范围。游泳池可以照顾到这一点。