Asyncio中的无限循环或“递归”

时间:2018-05-22 18:22:51

标签: python-3.x python-asyncio

我是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))

1 个答案:

答案 0 :(得分:2)

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

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

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