основные технологии Python и реальное - Shap | Python одновременное программирование Asyncio

В предыдущей главе мы узнали, реализацию Python параллельного программирования - многопоточный. Сегодня мы строим на прогресс, смотреть на другого параллельного программирования Python реализации --Asyncio. И что в предыдущей главе сопрограмма не то же самое, этот урок мы обращаем больше внимания на понимание принципов.

Изучая урок, мы знаем, что во время операции ввода / вывода, по сравнению с использованием многопоточности обычный однопоточный, эффективность была значительно улучшена, поэтому, почему Asyncio это?

Хотя многопоточность имеет много преимуществ и широко используется, но есть некоторые ограничения:

※ работает многопоточный процесс, скорее всего, будет прерван, возможно состояние гонки в случае

※ есть определенное потребление переключения поток, увеличить количество потоков не может быть ограничено, так что, если операция ввода / вывода очень интенсивно, многопоточный, вероятно, не отвечают высоким КПД, высокими требованиями к качеству.

Для того, чтобы решить эти проблемы, Asyncio возникло.

Что такое Asyncio?

Синхронизация VS Асинхронный

Во-первых, давайте различать SYNC (синхронно) понятий и асинхронной (асинхронный) с.

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

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


 

В качестве простого примера, мы должны сделать отчет и отправить по электронной почте к боссу, чтобы увидеть, что отличается двумя способами:

После ※ По ​​синхронизации образом, мы ввод данных с программным обеспечением, а затем подождать пять минут, чтобы создать подробный отчет, запись электронной почты отправляется владелец

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

Asyncio работы

Поймите синхронной и асинхронной рутину, мы возвращаемся к теме сегодня, в конце концов, что является Asyncio это?

На самом деле, Asyncio и других программ на Python, является однопоточных, у него был только один основной поток, но злонамеренный поведение целый ряд различных задач (задач), задача здесь заключается в будущем специальных объектов, таких разных задач, является объекты называется циклом событий (цикл событий) управление. Я могу поставить задачу здесь, сравнить с многопоточной версией нескольких потоков.

Для того, чтобы упростить понимание этого вопроса, мы можем предположить, что задача только два состояния: одно состояния готовности, но состояние ожидания, готовое средство состояния задачи в настоящее время простоя, но готова к запуску. Состояние ожидания относится к уже запущен, но ждет завершения внешней операции, такие как операции ввода / вывода.

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

 Стоит отметить, что для Asyncio, его задача не будет прервана внешними факторами во время работы оператор в случае Asyncio состояния гонки не происходит, так что нам не нужно беспокоиться о проблеме безопасности нитки ,

использование Asyncio

Принцип Asyncio закончен, мы в сочетании с определенным кодом, чтобы увидеть, если его использование. Или больше, чем урок загружаемого контента на сайте, например, в следующей редакции Asyncio (до сих пор обработка исключений опущена)

импорт asyncio
 импорт aiohttp
 импорта времени 
асинхронной четкости download_one (URL): 
    асинхронная с aiohttp.ClientSession () в качестве сессии: 
        асинхронный с session.get (URL) в качестве соответственно: 
            печать ( ' Read {} из {}. ' .format (соотв. content_length, URL)) 

асинхронная Защита download_all (сайты): 
    задачи = [asyncio.create_task (download_one (сайт)) для сайта в сайтах] 
    Await asyncio.gather ( * задача) 


Защита основной (): 
    сайты = [
     'https://en.wikipedia.org/wiki/Portal:Arts ' ' https://en.wikipedia.org/wiki/Portal:History ' ' https://en.wikipedia.org/wiki/Portal: Общество ' ' https://en.wikipedia.org/wiki/Portal:Biography ' ' https://en.wikipedia.org/wiki/Portal:Mathematics ' ' https://en.wikipedia.org/ вики / Портал: технологии ' ' https://en.wikipedia.org/wiki/Portal:Geography ' ' https://en.wikipedia.org/wiki/Portal:Science ' 'https://en.wikipedia.org/wiki/Computer_science ' ' https://en.wikipedia.org/wiki/Python_(programming_language) ' ' https://en.wikipedia.org/wiki/Java_(programming_language ) ' ' https://en.wikipedia.org/wiki/PHP ' ' https://en.wikipedia.org/wiki/Node.js ' ' https://en.wikipedia.org/wiki/ The_C_Programming_Language ' ' https://en.wikipedia.org/wiki/Go_(programming_language) ' 
    ] 
    start_time = time.perf_counter () 
 
    asyncio.run (download_all (сайты))
    END_TIME = time.perf_counter ()
     для печати ( ' вниз {} сайтов {} секундная ' .format (LEN (сайты), end_time- start_time)) , 

если  __name__ == ' __main__ ' : 
    основная ()

Асинхронный и ждать ключевое слово здесь является последняя формулировка Asyncio, выразил это утверждение / функция не является заблокирован, всего соответствует концепции выступая перед разворотом событий. Если в процессе ожидания выполнения задачи, он будет помещен в список ожидания, а затем перейти в состояние списка задач.

Основная функция asyncio.run (Коро) является Asyncio корень вызова, это указывает на то, чтобы получить цикл событий, Коро вход запуска, пока он не закончил, и, наконец, закрыть цикл событий. На самом деле, asyncio.run () вводится только после Python3.7 +, что эквивалентно предыдущей версии в следующий синтаксис

петля = asyncio.get_event_loop ()
 попробуйте : 
    loop.run_until_complete (Coro) 
наконец : 
    loop.close ()

 Как download_all в версии Asyncio (), и многопоточную версию, прежде чем есть большие различия:

задача = [asyncio.create_task (download_one (сайт)) для сайта в сайтах] 
Await asyncio.gather ( * задача)

Здесь asynco.creat_task (ядро), она представляет собой создание сопрограммы Коро ввести задачу, чтобы организовать его выполнение и возвращает этот объект задачи. Эта функция также Python3.7 поздняя версия добавляет, если в предыдущей версии, мы можем заменить его следующим:

asyncio.ensure_future (Coro)

Мы можем видеть, здесь мы загружаем каждый сайт, создали соответствующую задачу.

Затем смотрите вниз, asyncio.gather (* AWS, петля = None, return_exception = False), он работает AWS последовательности все задачи в цикле обработки событий. Конечно, в дополнение к ряду функций , используемых в данном примере, Asyncio также предоставляет множество других применений, мы можем увидеть в официальной документации Python .

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

дефекты Asyncio

К предыдущей лекции, мы можем видеть сильную Asyncio, но любой вид программы не является совершенным, есть некоторые ограничения, конечно Asyncio также то же самое.

В реальной работе, для того, чтобы сделать хорошее применение Asyncio, особенно хорошо играть свои мощные функции, во многих случаях должны иметь соответствующую библиотеку Python в качестве поддержки, мы могли бы найти перед многопоточного программирования мы используем библиотека запрос, но здесь мы используем библиотеку aiohttp, потому что запрос не совместим библиотека Asyncio, а библиотека aiohttp совместимы.

Asyncio вопросы библиотеки программного обеспечения совместимости в начале Python3 была большая проблема, но с развитием технологий, эта проблема постепенно решена.

Кроме того, при использовании Asyncio, из-за большую автономию с точкой зрения планирования задач, написать код, необходимый для уделять больше внимания, в противном случае он будет склонен к ошибкам.

Например, если нам нужно ждать целый ряд операций, взял использование asyncio.gathrer (), если это один Фьючерс, возможно, с помощью asyncio.wait () на нем. Ну, на будущее, нам нужно его run_until_complete () или run_forever (), чтобы тщательно думать о. И так далее, мы перед лицом конкретных вопросов, подлежащих рассмотрению.

Многопоточная или Asyncio?

Мы два способа параллельного программирования говорят, однако, практические проблемы возникают, мы выбираем такой метод программирования?

Должен прийти, мы можем следовать следующей спецификации

※ Если I / O связаны, и операции ввода / вывода медленно, требует много задач / нитей синергии достигнуто, то более целесообразно использовать Asyncio

※ Если это ввод / вывод связан, но ввод / вывод операция быстро, только ограниченное количество задач или нитей, то использование нескольких потоков на нем

※ Если ЦП, вам необходимо иметь несколько процессов для повышения эффективности работы.

резюме

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

Общие:

Есть параллельная работа, многопоточность в то же время только один поток работает, и сопрограммная только одна задача для выполнения;

Отличия: Многопоточность когда I / O блокируется переключение для достижения параллельных потоков эффекта, когда переключение определяются операционной системой, разработчики не должны беспокоиться, но будут вызывать состояние гонки;

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

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

Asyncio задача не будет прервана во время бега, так что случай гонки состояния не происходит. Особенно, как I / O-интенсивной работы, когда эффективность работы Asyncio будет выше, чем потери переключения поток мал. И число задач Asyncio также может открыть несколько потоков, чем число потоков.

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

вопросов

Мы говорили об идее двух параллельного программирования, параллельное программирование также упоминается несколько раз (Multi-Processing), которая подходит для CPU тяжелых сцен,

Сейчас спрос на входе списка а, указать случайный элемент, то этот элемент получает от 0 до квадратов всех целых чисел. Ниже приведены общие формулировки, если существует несколько версий этого процесса, но и как писать?

импорта время
 Защиты cpu_bound (номер):
     печать (сумма (я * I для I в пределах (число))) 

Защита calculate_sum (номера):
     для числа в номерах: 
        cpu_bound (число) 

Защита основное (): 
    start_time = time.perf_counter ( ) 
    числа = [10000000 + х для х в диапазоне (20 )] 
    calculate_sum (номера) 
    END_TIME = time.perf_counter () 

    печать ( ' takds Расчет {} секунд '.format (end_time- start_time)) 

если  __name__ == ' __main__ ' : 
    основной ()

Результаты работы (работают только размещены общая продолжительность)

Расчет takds 20.637497200000002 секунд

При таком подходе к взглянуть на

импорта время
 импорта MultiProcessing 

Защиты cpu_bound (номер):
     возврат сумма (я * I для I в пределах (число)) 

Защита find_sums (номера): 
    с multiprocessing.Pool () в бассейне: 
        pool.map (cpu_bound, цифра) , 

если  __name__ = = ' __main__ ' : 
    start_time = time.perf_counter () 
    число = [10000000 + х для х в диапазоне (20 )] 
    find_sums (номера) 
    END_TIME = time.perf_counter ()
    печать ( ' вычислений takds {} секундная ' .format (END_TIME-start_time))

Тогда взгляните на окончательную наработке

Расчет takds 7.3418618 секунд

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

рекомендация

отwww.cnblogs.com/yinsedeyinse/p/11931572.html