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

Асинхронное программирование в Python с Asyncio (для начинающих)

В этой статье я объясню асинхронное программирование в Python через библиотеку Asyncio. Прежде чем пойти… Теги с Асинсио, Питоном, асинхронным, Джанго.

В этой статье я объясню асинхронное программирование в Python через библиотеку Asyncio.

Прежде чем идти вперед, давайте понять мало терминов

Петли событий : Используется для запуска асинхронных задач (которые могут быть COROUTINE, будущим или любым ожидаемым объектами) одновременно, он может зарегистрировать задачу, которая будет выполняться, выполнить их, задержать или отменить их

Предположим, у нас есть 2 async-задач (Task1 и Task2) Теперь я расплачиваю оба задания на петле события, теперь предполагаю, что цикл события начинает выполнять задачу1 и столкнуться с операцией IO, то она заберет контроль от задачи 1 и придает ему задачу Task1 завершает IO и когда контроль возвращается к Task1, он возобновится из государства, он был остановлен, поэтому два или более задач могут одновременно запустить вместе

Очередными объектами : Мы говорим, что объект – это ожидаемый объект, если он может быть использован в ждут или выходе от экспрессии.

В Python есть три основных типа обычных объектов: Conoutines, задачи и фьючерсы.

Асинсио (асинхронный входной выход)

Asyncio – это библиотека, которая помогает запускать код одновременно с использованием одной темы или контура события, он в основном используется Async/await API для асинхронного программирования.

Asyncio был выпущен в Python 3.3 до того, как мы используем темы, диристущие и многопроцессорную библиотеку для достижения асинхронного программирования в Python

Почему нам нужно асинсио для асинхронного программирования?

  1. Поскольку нитки могут быть использованы для запуска нескольких задач одновременно, но потоки Python управляются операционной системой, а ОС приходится делать больше переключения контекста B/W-потоков по сравнению с зелеными нитями

  2. Greenlet (зеленые нити) убирает планировщик из ОС и играет сам планировщик, но CPYthon не использует зеленые потоки по умолчанию (это то, что Asyncio, Gevent, Pypy, et al.

  3. Используя многопроцессорную библиотеку, мы можем создать несколько процессов, и мы можем позволить программе в полной мере использовать все ядра компьютера, но процессы являются дорогостоящими для создания, поэтому для операций ввода/вывода нити выбраны в основном

В целом, Asyncio является более читающим и более чистым подходом к асинхронному программированию.

Как использовать Asyncio?

Когда Asyncio выпустил его, использовал @ asyncio.coroutine декоратор с COROUTINES на основе генератора Для достижения асинхронного программирования

Asyncio Generator Coroutines Используйте Уход от синтаксис, чтобы приостановить Corotine.

В приведении ниже quey_async_task () Является ли COROUTINE на основе генератора, чтобы выполнить этот COROUTINE, сначала мы должны получить петлю события (в строке 11), а затем запланируйте эту задачу для запуска в контуре события, используя (loop.run_until_complete)

Примечание: напрямую звонить quey_async_task () не будет запланировать эту задачу для выполнения, она вернет только объект генератора

Вот в очереди 8 asyncio.sleep () Является ли COROUTINE (мы можем использовать здесь любые Coontine или задачи/будущее), и когда выступает от оператора от выполненного его, который откажется от контроля к цикле события, чтобы позволить другим Conoutines выполнять и когда Coroutine asyncio.sleep () завершено и когда цикл события возвращает контроль на quey_async_task () Coroutine он будет запускать дальнейшую инструкцию (как линия 9)

В Python 3.5 Язык представил нативную поддержку COROUTINES. Теперь мы можем использовать синтаксис Async/ждут, чтобы определить родные COROUTINES

Способ с префиксом async def автоматически становится родным COROUTINE. ждать можно использовать для получения результата ожидаемых объектов (которые могут быть Coroutine, задачи или будущее)

Как запустить петлю событий?

Перед Python 3.7 мы вручную создаем/получаем контур событий, а затем запланируйте нашу задачу, как:

loop = asyncio.get_event_loop() #if there is no event loop then it will create new one. 
loop.run_until_complete(coroutine()) #run until coroutine is completed.

В Python 3.7 и выше, ниже предпочтительный способ запуска петли событий

asyncio.run(coroutine())
# This function runs the passed coroutine, taking care of managing the asyncio event loop and finalizing asynchronous generators.

Asyncio предоставляет Asi-API и низкоуровневые API, как правило, разработчик приложений использует API высокого уровня и библиотеку или разработчик Frameworke использует API низкого уровня

Фьючерсы в Асинсио

Это низкоуровневой, ожидаемый объект, который должен иметь результат в будущем.

Когда будущий объект ждал, это означает, что Coroutine будет ждать, пока будущее не будет решено в каком-то другом месте.

Этот API существует, чтобы включить код на основе обратного вызова, который будет использоваться с Async/a ждать

Обычно в коде уровня приложения мы не имеем дело с будущими объектами, оно обычно выставляется Asyncio API или библиотеки.

Задачи в Асинсио

Задача представляет собой подкласс фьючерсов, и он используется для одновременного запуска CITONINES в контуре события. Есть много способов создать задачу:

  1. LOOP.CREATE_TASK () → через низкоуровневый API и он принимает только COROUTINES.

  2. asyncio.ensure_future () → через низкоуровневый API, и он может принять любые обыскими объектами, это будет работать на всей версии Python, но она менее читабельна.

  3. asyncio.create_task () → через API высокого уровня, и он работает в Python 3.7+, и он принимает COROUTINES, и он обернет их как задачи

asyncio.create_task ()

Когда COROUTINE завернут в задачу с функциями, такими как asyncio.create_task () Корутина автоматически запланирована в ближайшее время В нижеприведении я использую AioHTTP Библиотека для получения новостных статей от Gacker-News Public APIS, я создал две задачу (Task1 и задачу 2), чтобы одновременно извлечь две разные новости и показывать название для обоих новостей.

asyncio.ensure_future ()

Это похоже на asyncio.create_task (), но он также может принять будущее, как показано введенным ниже примером

asyncio.ghather (* awavible_objects, return_exceptions)

Он отвечает за сбор всех результатов, он будет ждать до тех пор, пока все специальные объекты не будут завершены и вернуть результаты в порядке предоставления ожидаемых объектов

Если в любом из ожидаемых объектов есть исключение, он не отменит другие обычные объекты В приведенном ниже примере мы одновременно используем две задачи, и мы видим, что если есть исключение в some_async_task2 () это не отменит que_async_task () Контроль

Если return_exceptions это Ложь и если есть какое-либо исключение, поднятое в любом ожидающем объекте, то await asyncio.ghather () Возвращает немедленно и показать ошибку на экран. Так что для демонстрации демонстрации 17, мы ждем другого COROUTINE (что будет разрешено через 6 сек), чтобы убедиться, что программа не выходит по сравнению с 4 сек.

И мы можем увидеть выполнение строки 6 в выходе

Если мы хотим собрать все результат (вместе с исключением) в массиве, то мы можем использовать return_exceptions = Правда который будет лечить исключение в результате, и он будет агрегирован в списке результатов.

Вот и теперь в будущем, я напишу о том, как мы можем использовать эту библиотеку Asyncio в Джангу вместе с ASGI

Оригинал: “https://dev.to/the_dark_code/asyncio-for-beginners-fdj”