Как сделать выполнение генератора Python асинхронным? - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть кусок кода, который выглядит следующим образом:

def generator():
    while True:
        result = very_long_computation()
        yield result

def caller():
    g = generator()
    for i in range(n):
        element = next(g)
        another_very_long_computation()

По сути, я бы хотел максимально перекрыть выполнение very_long_computation() и another_very_long_computation().

Есть ли простой способ сделать генератор асинхронным? Я бы хотел, чтобы генератор начал вычислять следующую итерацию цикла while сразу после получения result, чтобы (в идеале) следующий result был готов к выдаче до последующего вызова next() в caller().

1 Ответ

0 голосов
/ 08 ноября 2018

Простого пути не существует, тем более что вместо 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...