【问题标题】:Async Function calling async generator calling async function异步函数调用异步生成器调用异步函数
【发布时间】:2020-02-06 16:52:42
【问题描述】:

我该如何解决先有鸡还是先有蛋的问题?

一个函数将返回生成器的第一个结果,该生成器必须从调用它的函数中收集数据。这适用于一般代码,但是一旦您在循环中抛出异步(我不想返回协程),它就会出错。我如何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

【问题讨论】:

  • 为什么不对异步迭代器进行异步迭代呢?您希望asyncio.run(second_iterator(number)) 解析到什么值?这段代码的非异步版本是什么?

标签: python python-3.x python-asyncio python-3.7


【解决方案1】:

您的脚本中应该只有一个 asyncio.run()。这是一个程序的入口点:

import asyncio


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


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

asyncio.run() 是唯一启动 event loop 的阻塞操作,它管理所有协程和任务的执行。

请考虑阅读asyncio上的一些教程,它可能会帮助您更快地实现目标:

【讨论】:

    猜你喜欢
    • 2012-07-25
    • 2013-07-12
    • 2013-03-28
    • 2018-12-13
    • 2019-01-20
    • 2020-04-20
    • 1970-01-01
    • 2020-10-13
    相关资源
    最近更新 更多