Asyn c Функция, вызывающая asyn c Генератор, вызывающий функцию Asyn c - PullRequest
1 голос
/ 06 февраля 2020

Как мне обойти проблему с курицей и яйцом?

Одна функция вернет первый результат генератора, этот генератор должен собрать данные из функции, которая его вызвала. Это работает в общем коде, но как только вы бросаете asyn c в l oop (я не хочу возвращать сопрограмму), он выдает ошибку. Как мне не вернуть сопрограмму из function_one?

Код:

import asyncio

async def second_iterator(number):
    for x in range(number):
        yield await function_one(x)

async def function_one(number):
    if number > 2:
        return asyncio.run(second_iterator(number))

    await asyncio.sleep(1)
    return number

def main(number):
    print(asyncio.run(function_one(number)))

main(3)

Ошибка:

Traceback (most recent call last):
  File "main.py", line 17, in <module>
    main(3)
  File "main.py", line 15, in main
    print(asyncio.run(function_one(number)))
  File "C:\Users\Owner\Anaconda3\lib\asyncio\runners.py", line 43, in run
    return loop.run_until_complete(main)
  File "C:\Users\Owner\Anaconda3\lib\asyncio\base_events.py", line 579, in run_until_complete
    return future.result()
  File "main.py", line 9, in function_one
    return asyncio.run(second_iterator(number))
  File "C:\Users\Owner\Anaconda3\lib\asyncio\runners.py", line 34, in run
    "asyncio.run() cannot be called from a running event loop")
RuntimeError: asyncio.run() cannot be called from a running event loop

1 Ответ

0 голосов
/ 07 февраля 2020

В вашем скрипте должен быть только один asyncio.run(). Это своего рода точка входа в программу:

import asyncio


async def main():
    # all your code is here


if __name__ == "__main__":
    asyncio.run(main())

asyncio.run() - единственная блокирующая операция, которая запускает событие l oop, которое управляет выполнением всех ваших сопрограмм и задач.

Пожалуйста, ознакомьтесь с руководством по asyncio, оно может помочь вам быстрее достичь своей цели:

...