【问题标题】:Infinite loop or "recursive" in AsyncioAsyncio 中的无限循环或“递归”
【发布时间】:2018-05-22 18:22:50
【问题描述】:

我是 Python3 asyncio 的新手。

我有一个函数可以不断地从 websocket 连接中检索消息。

我想知道是否应该以递归方式使用while True 循环或asyncio.ensure_future

哪个是首选还是无关紧要?

示例:

async def foo(websocket):
    while True:
        msg = await websocket.recv()
        print(msg)
        await asyncio.sleep(0.0001)

async def foo(websocket):
    msg = await websocket.recv()
    print(msg)
    await asyncio.sleep(0.0001)
    asyncio.ensure_future(foo(websocket))

【问题讨论】:

    标签: python-3.x python-asyncio


    【解决方案1】:

    我会推荐迭代变体,原因有两个:

    1. 更容易理解和扩展。与基于回调的期货相比,协程的好处之一是它们允许使用熟悉的控制结构,如 ifwhile 来模拟代码的执行。如果您想将代码更改为例如在现有循环周围添加一个外循环,或者在循环之后添加一些代码(例如另一个循环),这在非递归版本中会容易得多。

    2. 效率更高。调用asyncio.ensure_future(foo(websocket)) 会为每个新迭代实例化一个新的协程对象和一个全新的任务。虽然两者都不是特别重,但在其他条件相同的情况下,最好避免不必要的分配。

    【讨论】:

      猜你喜欢
      • 2014-10-13
      • 2016-10-06
      • 2010-10-21
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      相关资源
      最近更新 更多