我有一个用例,其中有两个作业,分别称为cpu_operation
和expensive_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_operation
和expensive_gpu_operation
都必须是“有状态的”,但是expensive_gpu_operation
本身是“有状态的”,因为它在始终存在的主进程上运行。
我该如何实现?
this SO question中的解决方案似乎实际上在返回结果之前耗尽了整个生成器-这不是我的目标。我需要将每个产生的值立即传递给expensive_gpu_operation