【问题标题】:python; asyncio async for statementPython; asyncio async for 语句
【发布时间】:2019-03-03 04:34:49
【问题描述】:

这里有一段代码来自:https://github.com/ronf/asyncssh/blob/master/examples/math_server.py#L38

async def handle_client(process):
    process.stdout.write('Enter numbers one per line, or EOF when done:\n')

    total = 0

    try:
        async for line in process.stdin:
            line = line.rstrip('\n')
            if line:
                try:
                    total += int(line)
                except ValueError:
                    process.stderr.write('Invalid number: %s\n' % line)
    except asyncssh.BreakReceived:
        pass

def 之前有一个async 关键字,但在for 循环之前也有一个关键字。在这里查看 asyncio 的文档时:https://docs.python.org/3/library/asyncio-task.html,我看不到这个 async 关键字的任何类似用途。

那么,关键字在这种情况下的作用是什么?

【问题讨论】:

标签: python-asyncio


【解决方案1】:

async for ... in ... 构造允许您循环“异步可迭代”,如 cmets 中所述,详细说明在 PEP 492

在您的示例中,async for 循环等待标准输入,而不阻塞其他异步循环任务。 如果您使用for 循环,这将是阻塞操作,并且在您输入的单元中无法执行循环上的其他任务。


再举一个例子,想象一下 MySQL 客户端从数据库中获取 x 行。 aio-mysql example

async for row in conn.execute("SELECT * FROM table;"):
    print(row)

这会获取单行,并且在等待 IO 操作(mysql 查询)时不会阻塞异步循环上其他任务的执行。

然后你对你获得的行数据做一些事情。

【讨论】:

  • 澄清“循环任务”中的 loop 指的是 asyncio 事件循环,而不是 async for 循环可能是有意义的。与许多初学者的预期相反,async for 循环仍然是完全顺序的 - 就像包含 awaits 的 while 循环一样 - 它只允许其他任务运行(如答案中所述)。
  • 感谢异步循环的通知。随意编辑答案:)
  • 你迭代的对象类型必须有__anext__定义的神奇方法
猜你喜欢
  • 2017-11-04
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 2016-12-18
  • 2018-09-24
相关资源
最近更新 更多