Простого пути не существует, тем более что вместо very_slow_io
у вас есть very_long_computation
и another_very_long_computation
. Даже если вы переместили generator
в свой собственный поток, вы будете ограничены глобальной блокировкой интерпретатора CPython, что исключит какое-либо повышение производительности.
Вы можете перенести работу в рабочий процесс, но модуль multiprocessing
не является заменой для threading
, которой он любит себя притворяться. Он полон странной семантики копирования, неинтуитивных ограничений и поведения, зависящего от платформы, а также просто требует больших затрат на коммуникацию.
Если у вас есть ввод-вывод вместе с вашими вычислениями, довольно просто перенести работу генератора в собственный поток, чтобы хотя бы выполнить некоторую работу во время ввода-вывода:
from queue import Queue
import threading
def worker(queue, n):
gen = generator()
for i in range(n):
queue.put(next(gen))
def caller():
queue = Queue()
worker_thread = threading.Thread(worker, args=(queue, n))
worker_thread.start()
for i in range(n):
element = queue.get()
another_very_long_computation()