питон;asyncio async для заявления - PullRequest
0 голосов
/ 28 февраля 2019

Вот блок кода из: 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 также есть одно ключевое слово.При просмотре документации по asyncio здесь: https://docs.python.org/3/library/asyncio-task.html, Я не вижу аналогичных вариантов использования этого ключевого слова async.

Итак, что делает ключевое слово в этом контексте?

1 Ответ

0 голосов
/ 01 марта 2019

Конструкция async for ... in ... позволяет циклически проходить через «Асинхронный итеративный», и, как указано в комментариях, подробное объяснение приведено в PEP 492

В вашем примере async forloop, ожидает ввода стандартного ввода, не блокируя другие задачи асинхронного цикла.Если бы вы использовали цикл for, это была бы операция блокировки, и никакие другие задачи в цикле не могли быть выполнены, пока вы не ввели ввод.


Чтобы получить другой пример, представьте, что клиент MySQL извлекает xстроки из базы данных. пример aio-mysql

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

Эта команда извлекает одну строку и не блокирует выполнение других задач в асинхронном цикле во время ожидания операций ввода-вывода (запрос mysql).

Затем вы что-то делаете с данными строк, которые вы получили.

...