Рубрики
Без рубрики

Что нового в Python: асинхронные поняты / генераторы

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Python 3.6 Добавлена возможность создавать асинхронные потенциальные и асинхронные генераторы. Вы можете прочитать о асинхронном понимании PEP 530 В то время как асинхронные генераторы описаны в PEP 525 Отказ Документация гласит, что теперь вы можете создать асинхронный список, установить и нарисовывание и разразительные выражения генератора. Их Пример Похоже, это выглядит:

result = [i async for i in aiter() if i % 2]

В основном вам просто нужно добавить новый Python async Ключевое слово в ваше выражение и вызовите Callable, который реализовал __aiter__

>>> result = [i async for i in range(100) if i % 2]
  File "", line 1
    result = [i async for i in range(100) if i % 2]
                    ^
SyntaxError: invalid syntax

Это на самом деле является определением. Если вы посмотрите в PEP 530, вы увидите, что он утверждает следующее: Асинхронные понятны разрешены только внутри функции async def. Конечно, вы не можете поставить Python’s ждать В понимании либо в качестве этого ключевого слова необходимо использовать только внутри async def Тело функции. Просто для удовольствия, я попытался определить функцию async def, чтобы увидеть, смогу ли я сделать мою идею работу:

import asyncio

async def test(): 
    return [i async for i in range(100) if i % 2]

loop = asyncio.get_event_loop()
loop.run_until_complete(test())

Если вы запустите этот код, вы получите TypeError: ‘async for’ требует объекта с методом __aiter__, получил диапазон Отказ То, что вы действительно хотите сделать, это позвонить еще одну функцию async def вместо диапазона звонков напрямую. Вот пример:

import asyncio

async def numbers(numbers):
    for i in range(numbers):
        yield i
        await asyncio.sleep(0.5)

async def main():
    odd_numbers = [i async for i in numbers(10) if i % 2]
    print(odd_numbers)

if __name__ == '__main__':
    event_loop = asyncio.get_event_loop()
    try:
        event_loop.run_until_complete(main())
    finally:
        event_loop.close()

Технически Числа Функция – асинхронный генератор, который дает значения нашему асинхронному пониманию списка.

Обертывание

Создание асинхронного списка понимание довольно разное, чем создание регулярного понимания списка. Как видите, требуется намного больше кода, чтобы он работал. Кроме добавления способности сделать более асинхронно из коробки, новый асинхронный генератор на самом деле должен быть 2 раза быстрее, чем эквивалент, реализованный как асинхронный итератор По словам PEP 525 Отказ Пока у меня нет случая использования для этой новой функциональности, это действительно аккуратно, чтобы увидеть, что я могу сделать сейчас, и я буду подавать эти новые концепции для некоторого будущего приложения.

Связанное чтение