Открыть изображение »
asyncio. Самая благостная фича Python со времен 3.0
24 ноября 2016 :: 48 комментариев :: 3881 просмотр :: 1185 слов
Форкающиеся и тредящиеся шарманки пускай подыхают вместе с богохульными Apache и персональными веб-сайтами, а современный блаженный бекенд должен быть неблокирующим. По крайней мере та его часть, которая принимает запросы пользователей. Для этого у кодобояр на боголюбимом Python с давних пор был tornado, который лихо имитировал асинхронность оборачивая ваш код в генераторы и заруливая это в свой бесконечный цикл aka ивентлуп из семи сами знаете чего. Идея так-то странная, но работала, и торнада стала первым веб-сервером на питоне, который выдерживал проблему 10К соединений.
0
Dustindog мне сильно понравилось


------
купить электрошокер police |
0
ReDetection ох. че как юзерагент у него, это реально человек или боты наконец добрались?
0
vas3k ReDetection, добираются время от времени, я их быстро удаляю. Пока терпимо.
В последнее время нормальные ребята бросились писать на Go, и ликовать от компилируемости и няшного маскота-грызуна. Я уже почти было сдался и готов был привыкнуть к карательному способу возврата ошибок в Go, но нулевой тулинг и отсутствие хоть каких-то библиотек для взрослых не давало мне покоя. Пусть вимеры sed'ом рефакторят. Ставь Atom говорят, заебись редактор, всего 16 Гб памяти жрет и не открывает файлы больше 5 Мб, зато синтаксис подсвечивает, инновация. Инженеры переднего конца наговнякали на джаваскрипте, не иначе.
[скрыть все] [развернуть все]  11 комментариев
0
̸̻̟̼̳͚̥̞̾ͧ̋ Странно выбирать платформу по текстовому редактору, не находишь?
0
cornholio Ой набросики-то!
1
vas3k Совсем не странно. Редактор — основной инструмент работы с, как ви говорите, "платформой". Не представляю как писать что-то сложнее скрипта или микросервиса без такого инструмента.
0
фдщтугтшч я видел как поцоны на петоне в атоме пишут!
0
gronpipmaster ты будешь удивлён, но даже микрософт сделал свою веб идее, где есть даже сука профайлер для гошки, пейтон можно закапывать, он никому ни нужен.
0
gronpipmaster профайлен(дебагер блять) попутал
1
vas3k gronpipmaster, идее в браузере? От майкрософт? Ебать ебать. Это не та сингулярность, которую я ждал! :D
0
anonymous что это за чатик?
0
vas3k anonymous, это канал про аниме
0
gronpipmaster @vas3k https://code.visualstudio.com
0
anonymous Я вот тоже так и не понял, почему Атом так захайпали как "заебись инновацию"
Потом нам пообещали Python 3.5 с asyncio в стандарте. Предвкушая этот релиз, я ходил по «уютным квартирникам доброжелательного Go-коммьюнити», где вежливо интересовался: уважаемые, я питонист, но очень хочу в Go. Правильно я понимаю, что из новых для меня плюсов остается только скорость языка, которая в реальной жизни редко является проблемой, так как большую часть времени программа висит в ожидании I/O? Дурак чтоле, горутины же! — отвечали мне в один голос. Я говорю ну вот же, в питоне asyncio, ивентлуп нативный, экстеншенами на С (которых у вас нет) если надо ускоряется в космос, в чем ваши преимущества? Но слово «Python» видимо является rage-триггером для коммьюнити Go, так как в ответ я был лишь обласкан каким-то кукареканьем про «оно же не в стандарте», «у нас было раньше» и «не надо разжигать тут холивар». Ладно. Нервые такие. Наверное из-за err != nil.
0
.̴̛͖͔̥͔͓͉͋̌́̈́̏ Go умеет из коробки крутить горутины в несколько потоков и собирается в статический бинарь.
0
. Rage-триггер - это не про платформу, а про людей. Это их
0
.̴̛͖͔̥͔͓͉͋̌́̈́̏ проблема, что они не смогли адекватно побеседовать о преимуществах и недостатках. И этот пост тоже нервный, кстати.
0
cornholio Я один считаю эксепшны самым ебучим способом обработки ошибок?
0
vas3k ., блин, про многопоточку было в первой версии поста, а потом удалил. Ну тут тоже двояко: получая многопоточку, получаем всю вековую боль ебли с синхронизацией и придумываем костыли типа каналов или как они там. Про бинарь принято, спасибо.
0
cornholio Если тебе нужна просто синхронизация — в го есть просто мьютексы. Каналы чаще решают асинхронные задачи, чем многотредные
0
gronpipmaster про каналы просто не асилил признайся, это очень удобный шланг для колекторов разных
0
ReDetection cornholio, нет, не один, я тоже
0
ReDetection Libdispatch предлагает создавать легковесные queue на каждый чих и синхронизироваться уже по ней
Так как на tornado я пишу большинство проектов последние года 4, asyncio я ждал как явление христа. Но только с 3.5 из-за конструкций async/await. Yield'ами обмазаться я и в tornado могу. Если вы пишете на питоне и всё еще не используете async/await — бегом открывать дивный новый мир. Конечно если вы не django-программист, тогда для вас по прежнему единственное развлечение — переписывать половину проекта из-за «небольших несовместимостей» при обновлении с 1.10 на 1.11.
0
.̴̛͖͔̥͔͓͉͋̌́̈́̏ Так ведь торнадо тоже сразу научилась поддерживать async/await, зачем было ждать именно asyncio?
Первое что бросается в глаза в async/await-коде — выпиливание скобочек. Больше никаких for item in (yield something), теперь async for item in something — ну булочка, а не синтаксис. Количество скобочек в проекте сократилось втрое. Да и суммарное количество говна поубавилось, все те костыли тщательно продуманные архитектурные решения, что я тщательно скопил за годы под tornado, остались только в хистори гитхаба. Я даже удалил папочку utils, вы вообще видели такое?!
0
ReDetection А в каком потоке тело придёт?
0
vas3k ReDetection, ну в общем случае это всё крутится в одном потоке, если ты сам не вкорячил их туда. Хочешь поток — инициализируй его уже в теле. Нахуй потоки, это очень дорого и добро пожаловать в мир мьютексов и семафоров. Но если уж очень хочется, то и в tornado, и в asyncio есть ThreadPoolExecutor, где потоки инициализируются заранее. Мне вот ни разу не пригождалось.
Бесшовный переход с tornado на asyncio выглядит так: подменяете стандартный eventloop, переходите на aio-либы (для БД, амазона и.т.д), в конце избавляетесь и от самой торнады, заменяя ее aiohttp или чем-то более быстрым (но менее удобным). Все шаги, кроме последнего, при правильной организации проекта не требуют крупных изменений. А на aiohttp вы уже сами всё за вечер переколбасите под эйфорией от процесса.
0
kapral о, вот кстати: какой профит у переезда с торнады на aiohttp?
0
kapral а, почитал дальше) получается теперь жизнь только на одном event loop, и все либы расчитанны под него?
0
kapral бялдь, короче как обычно: полез в комменты, не дочитав :D вопрос снимается
0
vas3k kapral, да, именно так. Торнада — последний оплот старого ивентлупа и даже если её полностью уговорить работать с asyncio, всё равно у нее кишки торчат где не надо. Корутины приходится оборачивать например. Да и вообще, если посмотреть как работать с вебсокетами в торнаде и aiohttp — то второй намного приятнее выглядит потому что всё в одном handler'е, а не в трех on_open/on_message/on_close и не надо писать костылей для миддлварей той же авторизации. В торнаде эти on_open'ы даже не корутины — это ШТО ВООБЩЕ ТАКОЕ
И вот погружаясь в мир aio-libs становится хорошо и тепло. Наконец-то это единый стандарт, больше никаких «специальных решений» под конкретный фреймворк, никаких tornado-redis — теперь aioredis, никаких странных momoko — теперь aiopg, никаких AsyncHTTPRequest — теперь aiohttp. Тенденция благостна. Все вместе, а не херачат наколеночные костыли под свой ивентлуп.
 +

Да они даже аналог моего уютного GodMode2 сейчас вон пытаются. Наступая на все те же грабли, что и я в первой версии, так мило.
 +
Казалось бы мелочь, заменили одни строчки в requirements.txt на другие, расстроились, что быстрее всего в 8 раз, а не в 16 (© @themylogin). Но нет. aioredis наконец-то рабочая обертка, а не та, где у автора на гитхабе написано «не используйте». Каких-то либ просто никогда не было: для общения с AWS приходилось колхозить обертки над их REST API, а теперь есть aiobotocore. Такой удобный, что я запилил им такой крутой pull-request, что они теперь зовут меня в мейнтейнеры, чем я неприменно должен был похвалиться.
0
.̴̛͖͔̥͔͓͉͋̌́̈́̏ А с gevent таких проблем изначально не было, например.
Были штуки, которые раньше сделать было ну почти невозможно. Например очень хотелось, чтобы через стандартный logging выводились ID юзеров, к которым относится данный запрос. Как вы понимаете в асинхронном коде это хитровыебанная задачка, так как нужно всегда знать текущий контекст. Отсюда растут ноги у любви asyncio'шников к конструкции with, в большинстве случаев лишней, чему удивлялся недавно DieGelassenheit. А теперь это решается простым aiolocals, который работает потому что в asyncio можно получать и писать прям в объект current task, который отвечает за конкретный запрос. И больше никаких пробросов контекста в callback, чтобы «логи не потерялись».
0
cornholio А вот это — охуенно. В ноде давно есть deprecated-домены, а нового не придумали. Хотя есть всякие zone.js и https://github.com/othiym23/node-continuation-local-storage
Кстати вот это «хранение переменных в чужих объектах» — новый странный паттерн, который активно используют в aio-либах, тот же aiohttp прям так и говорит — херачьте всё в request. На деле удобно, но опасненько в руках говнокодеров. Придется за ними следить, чтобы не устраивали себе в них уютный globals.
 +
Asyncio — киллер-фича Python 3.x. Я так вижу. Раньше ламберсексуалы еще могли вопрошать «зачем мне на 3.x переходить, ради пары новых конструкций чтоле», теперь же буду каждого такого ласкать по густой бороде этим постом. Несмотря на то, что пишу на питоне уже кучу лет и стало хотеться «чего-нибудь новенького» — после aio мысли об измене снова окладываются. Лучше Swift вон поковыряю.
 +
По любимым вами синтетическим уже в своём первом пришествии asyncio обноняет tornado в 5-10 раз, уделывает gevent, и всего в два раза отстает от скоростного Go. И уже есть ускоренные ивентлупы типа uvloop, который использует libuv из node.js, а работает быстрее, чем с родным джаваскриптом. Что на мой взгяд весьма иронично. Подключается одной строкой и вот интерпретируемый язычок внезапно дает писос этим вашим конпеляторам сатанинским.
0
.̴̛͖͔̥͔͓͉͋̌́̈́̏ [источник не указан 1 день]
0
vas3k .̴̛͖͔̥͔͓͉͋̌́̈́̏, вон же, по единственной ссылке в абзаце
0
.̞͔̝̹̗̗͓̗̐ͧ̐̅̒ͨ̚ Опачки, я и не заметил, что это ссылка.
Но сила языка не в соревнованиях кто быстрее отдаст Hello World на макбуке с ретиной, а в синтаксисе и количестве/качестве библиотек, так как от этого напрямую зависит скорость разработки и цена поддержки, а это уже сурьёзный бизнис просесс. И по этим параметрам на бекенде питону сопоставимы лишь олдскульные гиганты для программистов за 30. Ну или всегда можно наговнякать всё на каком-нить LuaScript, а потом загрустить и уволиться — пусть поищут идиотов, кто это сможет поддерживать, может поймут насколько я незаменим. Мы же художники, нам не задачу решать, а экспериментировать в поисках собственной уникальности! Отхлестал бы всех невидимой рукой рынка.
0
cornholio А чо ты не на джаве-то пишешь? Там тебе и редакторы, и «скорость», и библиотеки. И паттерны все пот как под джаву написаны.
0
vas3k cornholio, потому что тогда придется в пиджаке с митинга на бизнес-ланчи бегать, а я из контейнера предпочитаю
0
cornholio Любовь к докеру привела к тому, что ты ешь из контейнера!
0
.̞͔̝̹̗̗͓̗̐ͧ̐̅̒ͨ̚ Вот только вопрос про джаву вполне серьёзен.
0
cornholio .̞͔̝̹̗̗͓̗̐ͧ̐̅̒ͨ̚, я что, набросить смог что ли? Уиии ^^
0
vas3k .̞͔̝̹̗̗͓̗̐ͧ̐̅̒ͨ̚, ну если серьезно, то так исторически сложилось. Мог бы пойти и на джаву, всё равно приходилось писать на ней много в нашем с тобой универе. Но на рынке больше интересных лично мне проектов и задач было именно под Python. Так что снова "рыночек порешал" :) Попробуй щас найти что-то кроме махрового интерпрайза или андроида на джаве.
0
ReDetection Джава ещё не торт. Либо ждать, либо не джава
А если вы ожидали обзора asyncio, то тут его нет. О своём негодовании по поводу сего обязательно расскажите мне в Вастрик.Чате, а так же возвращайтесь в Вастрик.Пынь, там теперь срет не бездушная машина, а я сам.
0
.̴̛͖͔̥͔͓͉͋̌́̈́̏ Да ты же провокатор!
0
vas3k .̴̛͖͔̥͔͓͉͋̌́̈́̏, ну а как вас еще на диалог-то вытащишь :3
0
фдщтугтшч пынь
0
.̞͔̝̹̗̗͓̗̐ͧ̐̅̒ͨ̚ Нас никогда не было трудно вытащить на диалог.
Еще? Тогда вот
Комментарии
0
.̴̛͖͔̥͔͓͉͋̌́̈́̏ ⸬ 25 ноября 2016, 03:00 ⸬ RU ⸬ Apple лог
#
В общем, простите меня, но этот текст пахнет слепым фанатизмом, одни восторги и насмешки, а из голых фактов упомянут лишь объём готовых библиотек.
0
themylogin ⸬ 25 ноября 2016, 08:52 ⸬ Apple лог
#
К благостным известиям по поводу asyncio добавлю пост Armin Ronacher про его недостатки: http://lucumr.pocoo.org/2016/10/30/i-dont-understand-asyncio/
Честно перечитывал несколько раз, так и не нашёл для себя ничего по существу.
(не заполняйте это поле)

me@vas3k.ru :: telegram :: twitter :: instagram :: facebook :: github