我是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))
答案 0 :(得分:2)
我会推荐迭代变体,原因有两个:
更容易理解和扩展。与基于回调的未来相比,协同程序的一个好处是它们允许使用熟悉的控制结构(如if
和while
)来模拟代码的执行。如果您想将代码更改为例如在现有循环之后添加一个外部循环,或者在循环之后添加一些代码(例如另一个循环),这在非递归版本中会相当容易。
效率更高。调用asyncio.ensure_future(foo(websocket))
为每个新迭代实例化一个新的协程对象和一个全新的任务。虽然两者都不是特别重,但在其他条件相同的情况下,最好避免不必要的分配。