Python multiprocessing - 将新函数分配给已完成的进程?

Python multiprocessing - Allocate a new function to a finished process?

我有一个我想要并行处理的 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'])

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

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

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

这是一个简单但有效的示例。它还显示了两种可能的处理结果的方法。它执行回调并解析结果对象。你当然只会做其中之一 - 或者 none 如果你不关心你的工人的 return 值。

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)

这会生成一个 "tasks" 的列表,在本例中只是一个随机数列表。 Worker 通过休眠作为参数发送的秒数来模拟工作。你可以看到工人完成,最后当所有工人完成时,你会得到"result"。

始终有四个并行工作器处于活动状态,但任务列表不止于此。 Pool 能够解决这个问题。