我有一个生成器对象,它加载了大量数据并占用了系统的I/O。数据太大无法一次性全部放入内存,因此使用了生成器。
我还有一个消费者,它利用CPU处理生成器产生的数据。它不会占用太多其他资源。是否可能使用线程交替执行这些任务?
例如,我猜可以在11秒钟内运行下面简化的代码。
import time, threading
lock = threading.Lock()
def gen():
for x in range(10):
time.sleep(1)
yield x
def con(x):
lock.acquire()
time.sleep(1)
lock.release()
return x+1
然而,最简单的线程应用程序并不在那个时间内运行。它确实加快了速度,但我认为这是由于生成器和工作线程之间的并行性,而不是由于工作线程之间的并行性。
import joblib
%time joblib.Parallel(n_jobs=2,backend='threading',pre_dispatch=2)((joblib.delayed(con)(x) for x in gen()))
# CPU times: user 0 ns, sys: 0 ns, total: 0 ns
# Wall time: 16 s