现在我有一些代码大致如下
def generator():
while True:
value = do_some_lengthy_IO()
yield value
def model():
for datapoint in generator():
do_some_lengthy_computation(datapoint)
现在,I / O和计算是串行发生的。理想情况下,应该同时运行并行(生成器准备好下一个值)因为它们只传递传递的值。我开始研究这个并且对multiprocessing
,threading
和async
的内容感到非常困惑,并且无法获得最小的工作示例。此外,由于其中一些似乎是最近的功能,我使用的是Python 3.6。
答案 0 :(得分:1)
我最终搞清楚了。最简单的方法是使用multiprocessing
包并使用管道与子进程通信。我写了一个可以带任何生成器的包装器
import time
import multiprocessing
def bg(gen):
def _bg_gen(gen, conn):
while conn.recv():
try:
conn.send(next(gen))
except StopIteration:
conn.send(StopIteration)
return
parent_conn, child_conn = multiprocessing.Pipe()
p = multiprocessing.Process(target=_bg_gen, args=(gen, child_conn))
p.start()
parent_conn.send(True)
while True:
parent_conn.send(True)
x = parent_conn.recv()
if x is StopIteration:
return
else:
yield x
def generator(n):
for i in range(n):
time.sleep(1)
yield i
#This takes 2s/iteration
for i in generator(100):
time.sleep(1)
#This takes 1s/iteration
for i in bg(generator(100)):
time.sleep(1)
现在唯一缺少的是,对于无限生成器,进程永远不会被杀死,但可以通过执行parent_conn.send(False)
轻松添加。