蟒蛇;异步声明

时间:2019-02-28 15:49:35

标签: python-asyncio

这是来自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

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

那么,关键字在这种情况下会做什么?

1 个答案:

答案 0 :(得分:1)

async for ... in ...构造允许您遍历“异步可迭代”,并且如注释中所述,详细说明在PEP 492

在您的示例情况下,async for循环等待标准输入,而不会阻止其他异步循环任务。 如果您使用for循环,则将阻塞操作,并且在您输入内容的单元中,循环中的其他任务将无法执行。


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

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

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

然后您对获取的行数据进行处理。