首页 > 解决方案 > Python - 多处理中的生成器(产量)

问题描述

我有一个用例,我有两个工作,称为cpu_operationexpensive_gpu_operation每个工作都是 CPU 密集型的,需要很长时间。

expensive_gpu_operation,取决于 的输出cpu_operation。因此,考虑到我想要实现的多个流程,当expensive_gpu_operation正在处理任务 N 时,cpu_operation将已经开始处理 N+1。

没有生成器,这段代码cpu_operation没有状态,每次都从头开始执行——我需要它成为生成器

from multiprocessing.pool import Pool
from time import sleep


def cpu_operation(task):
    print('START CPU TASK {}'.format(task))
    sleep(5)
    print('END CPU TASK {}'.format(task))
    return '-{}-'.format(task)

def expensive_gpu_operation(task):
    print('GPU TASK {}'.format(task))



def quick():
    pool = Pool(processes=1)
    results = []
    for task in range(5):
        cpu_result = cpu_operation(task)
        async_result = pool.apply_async(expensive_gpu_operation, (cpu_result, ))
        results.append(async_result)

    return [x.get() for x in results]

这里的问题是,它cpu_operation是“无状态的”,我需要它成为一个生成器。这两种方法cpu_operationexpensive_gpu_operation必须是“有状态的”,但本质上expensive_gpu_operation是“有状态的”,因为它运行在始终存在的主进程上。

我怎样才能做到这一点?

这个 SO question中的解决方案似乎实际上在返回结果之前耗尽了整个生成器 - 这不是我的目标。我需要将每个产生的值立即传递给expensive_gpu_operation

标签: pythonpython-multiprocessing

解决方案


推荐阅读