Asyncio中的无限循环或&Quot;递归&Quot; [英] Infinite loop or "recursive" in Asyncio

查看:18
本文介绍了Asyncio中的无限循环或&Quot;递归&Quot;的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

这篇关于Asyncio中的无限循环或&Quot;递归&Quot;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆