learning/generator.py (25 lines of code) (raw):
import queue
import threading
def prefetch_generator(generator, to_fetch=10):
q = queue.Queue(maxsize=to_fetch)
def thread_worker(queue, gen):
for val in gen:
queue.put(val)
queue.put(None)
t = threading.Thread(target=thread_worker, args=(q, generator))
some_exception = None
try:
t.start()
while True:
job = q.get()
if job is None:
break
yield job
del job
# print("q.qsize() %d" % (q.qsize(),), flush=True)
except Exception as e:
some_exception = e
finally:
if some_exception is not None:
raise some_exception
t.join()
del t