Python Добавляет Асинхронность И Ожидание

Похоже, что вдохновленный C# асинхронный и ожидающий подход к асинхронному программированию пожирает мир. Python 3.5-это последний язык, на котором он был принят. 

Последнее предложение по улучшению Python (PEP), которое должно быть принято, – это:

PEP 0492 — Сопрограммы с синтаксисом async и await

Автор – разработчик CPython core Юрий Селиванов, который является основателем Sprymix.com, он добавляет асинхронный и ожидающий способ написания асинхронного кода в следующую версию Python. Обратите внимание, что это не будет перенесено обратно в какую-либо ветвь Python 2, потому что его разработка подошла к концу. Это может быть действительно хорошей причиной для обновления до Python 3, хотя это говорит о том, что для Python 3 уже запланировано много новых вещей, из-за которых стоит забыть о Python 2. 

Асинхронная работа-это факт жизни для языков, которые работают с однопоточными пользовательскими интерфейсами, такими как C# и JavaScript, но Python не особенно привязан к программированию пользовательского интерфейса. Проблема асинхронного программирования заключается в том, что оно портит простой поток управления, который вы имели бы в синхронной программе. Например, если вы хотите загрузить некоторые данные через Интернет, а затем обработать их, вы должны написать:

загрузка данных обработки данных

Однако, если загрузка происходит медленно и выполняется в потоке пользовательского интерфейса, ожидание приведет к замораживанию всего приложения. Прямое решение состоит в том, чтобы преобразовать шаг данных процессора в функцию и передать его в данные загрузки в качестве обратного вызова. Это работает, но очень быстро усложняется, что приводит к так называемому аду обратного вызова. 

Решение async и await решает проблему без изменения естественного потока управления. Вы можете ожидать любого вызова функции, который был объявлен асинхронным. Поэтому, если данные загрузки были объявлены “асинхронными данными загрузки”, вы можете написать свою программу как:

ожидание загрузки данных обработки данных

Поток пользовательского интерфейса будет освобожден, как только будут выполнены данные ожидания загрузки, и он вернется к обработке данных после завершения загрузки. По сути, вы просите компилятор/интерпретатор выполнить работу по созданию обратного вызова, эквивалентного обработке данных, а также сохранить и восстановить весь контекст. Например, если загрузка и процесс находились в цикле, то ожидание восстановит состояние цикла при его перезапуске. 

Проще говоря, ожидание и асинхронность делают асинхронное программирование таким же, как синхронное программирование, заставляя компилятор выполнять работу по преобразованию синхронного алгоритма в асинхронный.

Это намного превосходит другие подходы, и если вы считаете, что обещания или фьючерсы JavaScript – хорошая идея, подумайте еще раз-это намного проще, и это будет в следующей версии JavaScript. 

Реализация Python async и await также включает собственные сопрограммы в качестве новой автономной концепции. Ключевое слово async используется для определения собственной сопрограммы, а ключевое слово await используется для получения управления вместо ключевого слова yeild. Например:

async def get_data(): data=await slowdatadownload() …

Асинхронность помечает get_data как сопрограмму. Ожидание вызывает slowdatadownload и освобождает поток выполнения, который возвращается только после завершения slowdatadownload. 

Чтобы все это работало, slowdatadownload должен быть ожидаемым, который может быть собственной сопрограммой, сопрограммой на основе генератора или объектом с методом _await_.

Есть и другие вводимые средства, такие как асинхронный для; и есть некоторые точки взаимосвязи с генераторами, которые используются для реализации собственных сопрограмм. 

Список языков, которые поддерживают или будут поддерживать асинхронность и ожидание, растет – C#. Hack/HHVM, Dart, Scala и есть предложение добавить их в ECMAScript и C++.

Это становится стандартным способом выполнения асинхронности, и это не плохо.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *