В чем основная разница между асинчо и трио?

Сегодня я нашел библиотеку с именем trio, которая говорит, что сама по себе является асинхронным API для людей. Эти слова немного похожи на requests". Как requests действительно хорошая библиотека, мне интересно, каковы преимущества trio,

Там не так много статей об этом, я просто нахожу статью, обсуждающую curio а также asyncio, К моему удивлению, trio говорит сам по себе даже лучше, чем curio(сувенир следующего поколения).

Прочитав половину статьи, я не могу найти принципиальную разницу между этими двумя асинхронными фреймворками. Это просто дает несколько примеров того, что curioРеализация удобнее, чем asyncio"S. Но базовая структура почти одинакова (на основе обратного вызова, я думаю, что все асинхронные структуры ввода-вывода основаны на обратном вызове без каких-либо исключений).

Так может кто-нибудь дать мне причину, по которой я должен принять это trio или же curio лучше, чем asyncio? Или объясните больше о том, почему я должен выбрать trio вместо встроенного asyncio?

1 ответ

Решение

Откуда я родом: я основной автор трио. Я также являюсь одним из ведущих авторов curio (и написал статью об этом, на которую вы ссылаетесь) и разработчиком ядра Python, который активно участвовал в дискуссиях о том, как улучшить asyncio.

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

Тем не мение:

Трио против Асинсио

Asyncio более зрелый

Первое большое отличие - зрелость экосистемы. В то время, когда я пишу это в марте 2018 года, библиотек с поддержкой asyncio гораздо больше, чем с поддержкой трио. Например, сейчас нет никаких реальных HTTP-серверов с поддержкой трио. Классификатор Framework:: AsyncIO в PyPI в настоящее время содержит 122 библиотеки, а классификатор Framework:: Trio - только 8. Я надеюсь, что эта часть ответа быстро устареет - например, вот эксперимент Кеннета Рейтца с добавлением поддержки трио в следующей версии запросов - но сейчас вы должны ожидать, что если вы трио для чего-то сложного, то вы натолкнетесь на недостающие фрагменты, которые вам нужно заполнить, вместо того, чтобы взять библиотеку из pypi или что вам нужно использовать пакет trio-asyncio, который позволяет использовать библиотеки asyncio в программах trio. (Канал чата трио полезен для того, чтобы узнать о том, что доступно и над чем работают другие люди.)

Трио делает ваш код проще

С точки зрения реальных библиотек, они также очень разные. Основным аргументом для trio является то, что он делает написание параллельного кода намного проще, чем использование asyncio. Конечно, когда вы в последний раз слышали, как кто-то говорит, что их библиотека затрудняет использование... позвольте мне привести конкретный пример. В этом выступлении ( слайды) я использую пример реализации RFC 8305 "Счастливые глазные яблоки", который представляет собой простой параллельный алгоритм, используемый для эффективного установления сетевого соединения. Об этом Glyph думал уже много лет, и его последняя версия для Twisted имеет длину ~600 строк. (Asyncio был бы примерно таким же; Twisted и asyncio очень похожи архитектурно.) В докладе я научу вас всему, что вам нужно знать, чтобы реализовать его в <40 строках с использованием трио (и мы исправим ошибку в его версии, пока мы ' на это). Так что в этом примере использование trio буквально делает наш код на порядок проще.

Вы также можете найти эти комментарии от пользователей интересными: 1, 2, 3

Есть много много различий в деталях

Почему это происходит? Это гораздо более длинный ответ:-). Я постепенно работаю над написанием различных статей в сообщениях и беседах в блоге и постараюсь не забыть дополнить этот ответ ссылками по мере их появления. По сути, это сводится к тому, что у Trio есть небольшой набор тщательно разработанных примитивов, которые имеют несколько принципиальных отличий от любой другой библиотеки, о которой я знаю (хотя, конечно, опираюсь на идеи из многих мест). Вот несколько случайных заметок, чтобы дать вам некоторое представление:

Очень, очень распространенная проблема в asyncio и связанных библиотеках заключается в том, что вы называете some_function(), и он возвращается, так что вы думаете, что это сделано - но на самом деле он все еще работает в фоновом режиме. Это приводит ко всем видам хитрых ошибок, потому что это затрудняет управление порядком, в котором все происходит, или знать, когда что-то действительно закончилось, и это может напрямую скрывать проблемы, потому что, если фоновая задача падает с необработанным исключением, asyncio будет как правило, просто печатать что-то на консоли, а затем продолжать идти. В trio то, как мы обрабатываем порождение задач через "детские", означает, что ничего из этого не происходит: когда функция возвращается, вы знаете, что все сделано, и в настоящее время Trio является единственной библиотекой параллелизма для Python, где исключения всегда распространяются до тех пор, пока вы их не перехватите.

Трио в управлении таймаутами и отменами является новым, и я думаю, что лучше, чем предыдущие современные системы, такие как C# и Golang. Я действительно написал целое эссе об этом, поэтому я не буду вдаваться во все детали здесь. Но система отмены Asyncio - или, на самом деле, системы, она имеет две из них с немного отличающейся семантикой - основана на более старом наборе идей, чем даже C# и Golang, и их трудно использовать правильно. (Например, для кода легко "избежать" отмены путем создания фоновой задачи; см. Предыдущий абзац.)

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

В настоящее время Trio является единственной библиотекой параллелизма для Python, в которой control-C работает так, как вы ожидаете (т.е. KeyboardInterrupt где бы ни был твой код). Это маленькая вещь, но она имеет большое значение:-). По разным причинам, я не думаю, что это можно исправить в asyncio.

Подводя итоги

Если вам нужно отправить что-то в производство на следующей неделе, вам следует использовать asyncio (или Twisted, или Tornado, или gevent, которые еще более зрелые). У них большие экосистемы, другие люди использовали их в производстве до вас, и они никуда не денутся.

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

Если вы хотите отправить что-нибудь на производство через год... тогда я не уверен, что вам сказать. Параллельность Python постоянно меняется. У Trio есть много преимуществ на уровне дизайна, но достаточно ли этого, чтобы преодолеть преимущество Asyncio? Будет ли asyncio в стандартной библиотеке преимуществом или недостатком? (Обратите внимание, как в эти дни все используют requests, хотя в стандартной библиотеке есть urllib.) Сколько новых идей в trio можно добавить в asyncio? Никто не знает. Я ожидаю, что в этом году на PyCon будет много интересных дискуссий по этому поводу:-).

Другие вопросы по тегам