Asyncio против GEvent

Вопрос задан: 1 год назад Последняя активность: 1 год назад
up 12 down

Фон

Я когда-то работал в системе python2, что было много пользовательских кода ввода/вывода письменного синхронно, и масштабируется с использованием потоков. В каком-то момент, мы не могли масштабировать его дальше, и поняли, что мы должны перейти на асинхронное программирование.

  • скрученный был популярным, но мы хотели, чтобы избежать его обратного вызова ад.
  • Это же есть @inlineCallbacks декоратор, который эффективно реализованы сопрограммы с использованием магии генератора, так же как и некоторые другие библиотеки. Это было более терпимым, но чувствовал себя немного отслаиваться.
  • А потом мы нашли gEvent. Все, что вам нужно было сделать:
from gevent import monkey
monkey.patch_all()

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

Это не было совершенным:

  • Тогда, это не хорошо работать на Windows, (и он все еще имеет некоторые ограничения сегодня). К счастью, мы были запущены на Linux.
  • Он не мог расширения обезьяны патч C, поэтому мы не могли использовать MySQLDb, например. К счастью, есть много альтернатив чисто Python, как PyMySQL.

Вопрос

В настоящее время, Python 3 является гораздо более популярным, а вместе с ним - asyncio. Лично я считаю, что это здорово, но я недавно спросил, как это лучше, чем то, что мы сделали с GEvent, и не мог придумать достаточно хороший ответ.

Это может показаться субъективным, но я на самом деле ищу реальные потребительные случаи, когда один значительно превосходящих другой, или позволить что-то, что другие не делает. Вот те соображения, я собрал до сих пор:

  1. Как я уже сказал, GEvent довольно ограничена на Windows. С другой стороны, большая часть производства код, который я знаю работает на Linux.

    Если вам нужно работать на Windows, используйте asyncio.

  2. GEvent не может обезьяна патч расширения C. Но, asyncio не может обезьяна патч что-нибудь.

    Представьте себе, что новая технология DB приходит, и вы хотели бы использовать его, но есть не чистая библиотека Python для него, так что вы не можете интегрировать его с GEvent. Дело в том, что вы так же, как застрял, когда есть не И.О. * библиотека, вы можете интегрировать с asyncio! Есть рабочие потоки и исполнители, конечно, но это не точка, и работает так же хорошо в обоих случаях так или иначе.

  3. Некоторые люди говорят, что это вопрос личного вкуса, но я думаю, что это справедливо сказать, что синхронное программирование изначально проще, что асинхронное программирование (думать об этом: вы когда-нибудь встретили начинающий программист, который может работать с сокетами, но есть трудно понять как правильно выбрать/опрашивать их, или думать фьючерсные/обещания? А вы когда-нибудь встречались наоборот?).

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

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

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

Итак: что некоторые конкретные потребительные случаи, когда превалирует asyncio? Конечно, Гвидо и сообщество Python была уважительная причина, чтобы положить столько усилий в нее, и даже вводить новые ключевые слова на языки - я просто не могу найти их.

1 ответ

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Реклама

up 5 down

"«Простой» ответ от реального мира использования:

  1. Хорошая вещь о GEvent - вы можете исправить вещи, а это значит, что вы [теоретически] можно использовать синхронные библиотеки. То есть Вы можете исправит.д.анго.
  2. Плохая вещь о GEvent - не все может быть исправлено, если вы должны использовать какой-то драйвер DB, который не может быть исправлен, вы обречены
  3. Хуже всего о GEvent - это «волшебный». Сумма усилий, необходимых, чтобы понять, что происходит с «patch_all» огромна, то же самое усилие относится к поиску/найма новых людей для команды разработчиков. Что еще хуже - отладка GEvent-кода на основе ад. Я бы сказал, почти такой же ад, как и обратные вызовы, если не хуже.

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

Это то, что делает asyncio так хорошо - это простой в обслуживании. Недостатком является то, что почти все «мир» должен быть асинхронной тоже - БД драйверов, HTTP инструменты, обработчиков файлов. И иногда вы будете отсутствовать библиотеки, который в значительной степени гарантирован.

Ошибка 505

Что-то пошло не так

Попробуйте воспользоваться поиском