python - Python - 多处理中的生成器(产量)
问题描述
我有一个用例,我有两个工作,称为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
是“有状态的”,因为它运行在始终存在的主进程上。
我怎样才能做到这一点?
这个 SO question中的解决方案似乎实际上在返回结果之前耗尽了整个生成器 - 这不是我的目标。我需要将每个产生的值立即传递给expensive_gpu_operation
解决方案
推荐阅读
- bitbucket-pipelines - atlassian/scp-deploy 在 bitbucket 部署管道上从 SCP 中排除文件夹的问题
- r - R 包 dplyr 中的主要功能对我不起作用
- docker - nginx 服务器未启动它会抛出错误 bind() to 0.0.0.0:80 failed (13: Permission denied)
- python - 有效值
- reactjs - 如何在 ComponentDidMount() 的 React 组件类中调用函数 mySaga
- powershell - 为什么我的 powershell try catch 代码只打印错误?
- java - 父类、子类和嵌套类之间的静态成员初始化顺序
- flutter - 卡在颤振 gradle build
- mysql - MySQL 意外的字符串比较行为
- ios - 使用 CALayer 绘图总是比使用 CoreGraphics 更好吗?