Асинхронный Python-код медленнее обычного кода! Ааа!!1один. Aiohttp VS синхронные фреймворки

Sdílet
Vložit
  • čas přidán 12. 07. 2024
  • Мой курс «Хардкорная веб-разработка» - course.to.digital
    Книжный клуб Ботаним!, где мы читаем хорошие ИТ-книги: botanim.to.digital/
    Telegram: t0digital.t.me
    Сказать спасибо за это видео можно здесь - boosty.to/digitalize.team
    А точно ли вообще асинхронность в питоне нам нужна? Есть мнение, что старые добрые синхронные веб-фреймворки на Python таки работают быстрее и надёжнее. Давайте проверять!
    Две упоминаемые статьи:
    habr.com/ru/post/440282/
    habr.com/ru/company/ruvds/blo...
    0:00 Популярные тесты производительности Python веб-фреймворков
    3:49 Разворачиваем проект под тесты
    6:39 Запуск тестов Aiohttp
    9:05 Запуск тестов Meinheld с Falcon
    10:40 Aiohttp сливает, асинхронность отстой:(
    11:22 Или нет?
    12:02 Изменим тесты и проведём их снова
    14:38 Ёлочки-палочки, что происходит? Почему?
    17:15 Мультипроцессинг, мультипоточность, асинхронность - когда что использовать?
    /****************** about ******************/
    Меня зовут Алексей Голобурдин, я программирую с 2004 года и на этом канале делюсь своим опытом. Я основатель и руководитель компаний:
    - Диджитализируй digitalize.team, разрабатываем сложные IT системы для бизнеса;
    - Salesbeat salesbeat.pro, комплексный модуль доставки для интернет магазинов.
    Если у вас есть проект на разработку, пишите нам на hi@digitalize.team.
    С другими предложениями, а также если вам нужна одна или несколько индивидуальных консультаций/уроков по разработке (3000 руб/час), пишите мне на alexey@salesbeat.pro.
    Telegram канал - t.me/t0digital
    ВК - digitalize.team
    RuTube - rutube.ru/channel/24802975/ab...
    Дзен - dzen.ru/id/6235d32cb64df01e6e...

Komentáře • 396

  • @t0digital
    @t0digital  Před 6 měsíci +1

    Мой курс «Хардкорная веб-разработка» - course.to.digital
    Вжух!

  • @starlightx3052
    @starlightx3052 Před 3 lety +175

    Вспомнился прекрасный ответ со stackoverflow:
    if io_bound:
    if io_very_slow:
    print("Use Asyncio")
    else:
    print("Use Threads")
    else:
    print("Multi Processing")

    • @t0digital
      @t0digital  Před 3 lety +10

      Да!

    • @karlzinher4181
      @karlzinher4181 Před 3 lety +1

      что за выравнивание самовольное не по пепу ? :D :atata

    • @Uni-Coder
      @Uni-Coder Před 3 lety +2

      Я бы написал "Use threads OR asyncio if you are used to", при относительно быстром IO можно и async использовать, если вам привычнее.
      Да и вообще, в клиент-серверных приложениях в современном контексте async должен быть по умолчанию.

    • @ziminf1997
      @ziminf1997 Před 3 lety

      @@karlzinher4181 Почему не по пепу?

    • @karlzinher4181
      @karlzinher4181 Před 3 lety

      @@ziminf1997 не заморачивайтесь :) визуально три пробела показывает %) а по факту 4ре))) верстка в хроме зачетная тут

  • @user-tk8cm3km9t
    @user-tk8cm3km9t Před 3 lety +70

    Поигрался с этими тестами и обнаружил, что выдаваемые ими RPS прямо пропорциональны доступному количеству соединений с БД.
    В тестах для синхронных фреймворков используется пул psycopg2, но в них он абсолютно бесполезен. Каждый воркер будет использовать лишь одно соединение из пула: взял соединение, выполнял запрос, вернул соединение в пул. Т.о. получается потолок для синхронных фреймворков: 12 воркеров * 1 соединение * 5 запросов в секунду (по 0.2) = 60 rps.
    С асинхронными фреймворками ситуация иная. После того, как воркер взял соединение из пула и отправил в него запрос он не ждёт ответ из БД, а берет второе соединение, третье и т.д., пока не загрузит весь свой пул работой. По умолчанию, максимальный размер пула aiopg составляет 10 соединений. Итог: для асинхронных соединений потолок в этих тестах составляет: 12 воркеров * 10 соединений * 5 запросов в секунду (по 0.2) = 600 rps.
    В свете этого, цифры, показанные тестами, не значат ничего конкретного, т.к. получены в разных условиях. Зато они отлично отражают подход. Ради смеха, я решил сравнять количество доступных соединений к БД для двух фреймворков. Для асинхронного Sanic я использовал 4 воркера, то есть 40 соединений. Для Flask пришлось создать 40 воркеров =)
    В обоих кейсах я получил ожидаемые 200rps. Но какой ценой! 40 процессов для Flask стоили мне в сумме 900Mb памяти. А 4 процесса Sanic - 90Mb.

    • @ivantolkachev
      @ivantolkachev Před rokem

      Тоже самое хотел написать, просто нужно в синхрон добавить воркеров и можно получить такой же результат.

    • @user-pg8ry1tm3t
      @user-pg8ry1tm3t Před rokem

      Прекрасный анализ. Спасибо

    • @user-pg8ry1tm3t
      @user-pg8ry1tm3t Před rokem

      То есть получается из-за того, что сипитон однопоточный, поэтому синх использует только один тред в воркере… или нет? Я не питонист…

  • @user-kx6hz3sr9f
    @user-kx6hz3sr9f Před 3 lety +141

    Очень здорово придумал подачу. Поставлена задача и все ручками решается прямо при зрителе. На мой взгляд очень полезно, особенно начинающим.

    • @t0digital
      @t0digital  Před 3 lety +8

      Спасибо! Рад, что полезно!

  • @romantsaregorodtsev9993
    @romantsaregorodtsev9993 Před 3 lety +296

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

    • @user-eg8li6no4u
      @user-eg8li6no4u Před 3 lety +7

      И использовать языки для нужных задач. Во дела))
      Согласен))
      А то получается, словно унитаз вилкой чистить)))

    • @GexPlayerMD
      @GexPlayerMD Před 3 lety

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

    • @allallall2321
      @allallall2321 Před 3 lety +7

      Смотрите ХАудихо там все ответы на вопросы!

    • @dmitryponyatov2158
      @dmitryponyatov2158 Před 3 lety +1

      или сменить платформу на Elixir/Phoenix, тогда точно придётся думать -- в языке нет циклов 8)
      но того стоит - полноценная многозадачка, а nginx перед ним _мешает_ работать

    • @lalalf4535
      @lalalf4535 Před 2 lety

      @@user-eg8li6no4u класс

  • @ase_ventura
    @ase_ventura Před 3 lety +8

    Ой, вот прям в нужное время.. Вот как раз таких крутых видео не хватает. А то везде видео с маркетинговыми заголовками, а здесь всё круто и по делу.
    Спасибо за контент! Продолжайте в том же духе.

  • @_t4g
    @_t4g Před 3 lety +8

    Твои ролики это топ)они странным образом побуждают после просмотра разобраться самому и углубиться в тему ролика!Это по настоящему прекрасно, спасибо тебе.

    • @t0digital
      @t0digital  Před 3 lety

      Спасибо! Эта самая правильная реакция:)!

  • @TeppopucT
    @TeppopucT Před 3 lety +21

    Разрушители мифов в мире IT.
    Классная демонстрация! Спасибо!

  • @user-yo5qp8mi7o
    @user-yo5qp8mi7o Před 2 lety

    Спасибо за труд! Смотрю с удовольствием.

  • @Vlad-user-hjcgxffxhnjvhhcy
    @Vlad-user-hjcgxffxhnjvhhcy Před 3 lety +17

    11:00 - 11:20
    Сыграно АГОООНЬ! Аж слёзка подкатила! ))
    Классный канал!

  • @user-cn5pd6do9n
    @user-cn5pd6do9n Před 3 lety +1

    Спасибо за видео!
    Очень информативно

  • @kannykl7575
    @kannykl7575 Před 3 lety +44

    Пришёл не по уведомлению, а по зову сердца
    Спасибо за топ контент!

    • @t0digital
      @t0digital  Před 3 lety +6

      спасибооо!

    • @user-mh6dz7bd8o
      @user-mh6dz7bd8o Před 3 lety

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

    • @t0digital
      @t0digital  Před 3 lety +1

      @@user-mh6dz7bd8o да, согласен. Дорасту до монтажера, видосы вообще станут вкусняшкой:)

  • @79fz270704
    @79fz270704 Před 3 lety +10

    Лайк за хорошие рекомендации!

  • @TheFomars
    @TheFomars Před 3 lety +21

    На синхронном сервере при 12 воркерах и 200 мс теоретический предел - 60 рпс. Чтобы выжать из него больше, надо поднимать число воркеров

  • @kubenet
    @kubenet Před 3 lety

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

  • @georgestatefield
    @georgestatefield Před rokem

    Это видео было полезным, как и другие
    Алексей - молодец!

  • @vitalik100500q
    @vitalik100500q Před 3 lety

    Классное видео. Спасибо!

  • @user-oh8oq4oz7d
    @user-oh8oq4oz7d Před 3 lety +1

    Очень грамотный и доходчивый контент.

  • @LewaSGN
    @LewaSGN Před 3 lety

    Очень полезно и доходчиво! Спасибо, буду иметь ввиду.

  • @rumartru
    @rumartru Před 3 lety

    На многих ресурсах видел перевод статьи про асинхронность. Спасибо за разбор!

    • @t0digital
      @t0digital  Před 3 lety +1

      Рад, что полезно!

  • @rkozom
    @rkozom Před 3 lety

    Круто! Спасибо!

  • @user-lz3ez3nn4j
    @user-lz3ez3nn4j Před 3 lety

    Классное видео, спасибо

  • @user-zc5lk2fv9r
    @user-zc5lk2fv9r Před 3 lety +1

    Интересно, спасибо!

  • @sevashpun
    @sevashpun Před rokem

    Спасибо за видео!

  • @gnompirogov9259
    @gnompirogov9259 Před rokem

    спасибо за подробный разбор

  • @maxshishkn
    @maxshishkn Před 3 lety

    Лёха все супер, продолжай радовать котанов
    мяу 😻

  • @staskomar
    @staskomar Před 3 lety

    Чувак жги, всегда лайк))

  • @StoGigovo
    @StoGigovo Před 3 lety +2

    Алексей, продолжай, я на твоих видео такими темпами стану Мидлом!)

  • @doskuloff
    @doskuloff Před 3 lety

    В очередной раз спасибо Вам, Алексей! Ну а я все еще в комнате ожидания DRF😂

    • @t0digital
      @t0digital  Před 3 lety

      однажды будет и DRF

    • @senatortre7326
      @senatortre7326 Před 3 lety +1

      Диджитализируй! Раз пошла пляска (великолепная кстати) с асинхронном, можно скомбинировать темы и заменить дрф на ФастАпи

  • @vb3039
    @vb3039 Před 2 lety

    Очень интерестно :)

  • @user-ci8ll4kx4i
    @user-ci8ll4kx4i Před 3 lety

    Круто! Ума нет считай - тормоз во всем!!!!! Видео очень полезно понравилось

  • @evgenibasov9545
    @evgenibasov9545 Před 2 lety

    Офигенно 👍

  • @demos998
    @demos998 Před 3 lety

    Очень полезно!!!

  • @user-ni4vw6yw8b
    @user-ni4vw6yw8b Před 3 lety

    Отличная работа!

  • @adilzhan8282
    @adilzhan8282 Před 3 lety +1

    Очень интересное и полезное видео! Буду ждать еще подобных видео!) И есть просьба, если возможно, пожалуйста объясняй, кратко, всякие термины, которые могут быть кому-то не известно)) Я например не знаю что такое трейды( Я понимаю что есть гугл, но просто отвлекаться что бы найти и понять каждый термин как-то не очень)

    • @t0digital
      @t0digital  Před 3 lety

      в прошлом видео как раз было о том, что такое треды, процессы, асинхронность, основные термины

    • @adilzhan8282
      @adilzhan8282 Před 3 lety

      @@t0digital а, оу, я его смотрел, но успел забыть) Спасибо!

  • @Igor-if7sx
    @Igor-if7sx Před 3 lety

    Уф, заметил, что не все твои видео со своих трех акков лайкнул, а не, показалось. Лайкнул каждое по три раза..)

    • @t0digital
      @t0digital  Před 3 lety

      Йеее:) Спасибо! 💪

  • @drygdryg2
    @drygdryg2 Před rokem

    Спасибо, очень интересно и полезно.
    Было бы интересно увидеть тест с участием asyncpg вместо aiopg.
    Также интересно, как правильно профилировать приложения, чтобы понимать, на что уходит больше всего процессорного времени: на ввод-вывод, либо на вычисления, и сколько на что из этого уходит.

  • @antonmullakhmetov707
    @antonmullakhmetov707 Před 3 lety

    Спасибо!

  • @ilyasbutaev3830
    @ilyasbutaev3830 Před 3 lety +3

    Было бы интересно послушать про event loop от вас

  • @eb6006
    @eb6006 Před 3 lety

    У тебя такто все темы интересные ))

    • @t0digital
      @t0digital  Před 3 lety

      Спасиб:) будем продолжать

  • @staticintsolo1939
    @staticintsolo1939 Před 3 lety

    как нельзя кстати
    сейчас стоит задача как то ускорить процесс отправки запросов к смтп серверу, а то после 30-ого скорость растет будто по факториалу, и тут контент..
    годнота!

  • @user-fs5md2gd9u
    @user-fs5md2gd9u Před 3 lety

    Спасибо за материал! Интересно посмотреть меняется ли ситуация при использовании микросервисов в докере. И скейлинг горизонтальный. Что лучше поместить в этом случае в докер, aio или стандартпый фреймворк. Для увеличения показателей qps.

  • @OlegKuzminov
    @OlegKuzminov Před 3 lety

    Шикарный момент на, 11:10! :)

  • @zzshek
    @zzshek Před 2 lety

    спасибо

  • @alexgladkov7996
    @alexgladkov7996 Před 3 lety

    Спасибо

  • @volodiaagadjanov7087
    @volodiaagadjanov7087 Před 3 lety +7

    Это слишком очевидно, логично, что при синхронном выполнении эти 200мс будут суммироваться с временем выполнения
    А в ассинхронном - эти 200мм будут раскидываться на количество потоков

    • @Bisirsky
      @Bisirsky Před 2 lety +3

      Я вот тоже не понял. А нельзя было реальные запросы потестить(?)

  • @yaroshchenko_creative
    @yaroshchenko_creative Před 2 lety

    Хорошо что досмотрел а то уже расстроился.

  • @bolatmukashev2830
    @bolatmukashev2830 Před 3 lety +1

    А можно видео про то чем отличается многопроцессинг, многопоточность и асинхронность?
    С примерами на Python

  • @user-lg6dt3jf1j
    @user-lg6dt3jf1j Před 3 lety +1

    Мхатовская пауза в середине очень понравилась! Аж сердце замерло, неужели думаю,... и в самом деле... асинхронный Питон полный отстой... Ан нет! Живём-с :)

  • @denissemikin2683
    @denissemikin2683 Před 3 lety +1

    Досмотрел видео до конца. Да, aiohttp работает хорошо когда доставили sleep, но заметьте что wrk на aiohttp возвращает 59 респонсов не с 200-300 статус кодами. Поэтому он показал цифры быстрее конечно, но при этом респонсы некоторые были невалидные вообще.

  • @user-sn7pp1uz6m
    @user-sn7pp1uz6m Před 3 lety

    17:45 мне кажется это свойственно не только питону, это в общем так работает

  • @Uni-Coder
    @Uni-Coder Před 3 lety

    Асинхрон же придумали именно для IO-нагруженных задач, естественно, в них и надо тестировать и сравнивать
    (мелким шрифтом: формально, есть асинхронные операции и для CPU-нагруженных задач, см. C#, но мы же знаем, что многопоточность и CPU-нагруженные задачи - это не про Python).
    Упс, написал до того, как просмотрел до 16:20 и тем более 17:58. Да, просто полностью согласен

  • @googleadmin4749
    @googleadmin4749 Před 2 lety

    Красавчик

  • @cyrilanisimov
    @cyrilanisimov Před 3 lety +1

    Мораль - доверяй (статьям), но проверяй

  • @vandriichuk
    @vandriichuk Před 2 lety

    Спасибо за видео. А чем записываете экран когда пишете код, чтобы было прозрачно?

    • @t0digital
      @t0digital  Před 2 lety

      Просто режим наложения слоя скринкаста какой-то в монтажке

  • @prepyev
    @prepyev Před 3 lety

    Спасибо, как раз вовремя!
    P.S. На столе PocketBook 740?

    • @t0digital
      @t0digital  Před 3 lety +1

      Он самый:)

    • @prepyev
      @prepyev Před 3 lety

      @@t0digital Хе-Хе, долго искал эту обложку под принт на домах у нас у Бутово, узнал :))

    • @t0digital
      @t0digital  Před 3 lety +1

      @@prepyev а что за принт на домах у Бутово?

    • @prepyev
      @prepyev Před 3 lety

      ​@@t0digital ​ Чет мне как-то показалось, видосы канала из офиса в БЦ "Лотос", вот и подумал может соседи. А принт вот этот etaloncity.ru/about/news/3238/ Кацусики Хокусая

    • @t0digital
      @t0digital  Před 3 lety +1

      @@prepyev о, не видел это принт на зданиях. Мне нравится эта картина, кайфовая. Видосы из Лотоса, да:)

  • @magictearsasunder
    @magictearsasunder Před 3 lety +2

    Хотелось бы посмотреть по ASGI и WSGI в джанге.

    • @t0digital
      @t0digital  Před 3 lety +3

      Планирую такой материал

  • @maxsvetlychny8081
    @maxsvetlychny8081 Před 3 lety

    Как всегда спаcибо за видео! Небольшой оффтоп вопрос - не страшно запускать код какого-то постороннего чувака под своим юзером? У меня обычно для этого заготовлена песочница на firejail. Это нормальное решение или паранойя?)

    • @t0digital
      @t0digital  Před 3 lety +1

      ну в целом паранойя лишней не бывает:)

  • @user-kh7nl8sv1j
    @user-kh7nl8sv1j Před 3 lety +2

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

  • @user-gt6ik3se8n
    @user-gt6ik3se8n Před 2 lety

    Я думаю, что даже в примере, когда запрос долгий, можно сказать, что синхронный ВОЗМОЖНО будет быстрее. Стоит различить две ситуации: когда база данных находится на той же машине, что и сервис, и когда они разделены. Показанный пример - это пример, когда они разделены (запрос в бд не нагружает железо сервиса). Но если запрос в бд будет активно нагружать железо сервиса, асинхронные фреймворки не будут уже так себя комфортно чувствовать. Хотя много зависит от запроса: он может быть на чтение большого кол-во данных, а может на построение новой сложной структуры...

  • @slukinkostja2064
    @slukinkostja2064 Před 3 lety +2

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

  • @artemstroev3149
    @artemstroev3149 Před 3 lety

    Очень захотелось увидеть результат Django на sleep 0,2

  • @vrabosh
    @vrabosh Před 3 lety +4

    1. Я как понял форк запускает несколько скриптов, т.е. подымает несколько серверов и каждому по очереди скармливает http даннные запросы.. если так, то запусти на синхроно, 100 форков и посмотри что будет. т.е. пока там 200мс простаивает, другие скрипты же могут выполнятся..
    2. Когда идет синхроная обработка, то и запросы в БД идут синхроно, а значит БД не загружена, и будет выполнятся по той скорости как будто 12 запросов в БД одновременно, что снижает нагрузку на процессор и будет быстрее выполнятся.. как в асинхроности это может быть 1000 запросов к БД, что реально будет делать 200мс...
    Все выше доводы говорят о том, что тесты не 100% верны. Еслиб вы написали реально реализацию с БД, где от одного запроса идет выполнения скрипта 200мс, хотябы просто селект без индексов, тогда бы тесты былибы адекватными. А пока первый вариант где синхроность выглядит более реалистично, посути на реальном примере, пускай и банальном.. т.е. если у когото такой банальный пример, простой чат-бот, то синхроность как я понял лучший вариант.

    • @user-md3nz9hy8z
      @user-md3nz9hy8z Před 3 lety

      Там слишком много неизвестных. Где находится база данных (на том же компьютере или нет) и как реализована задержка в селекте, где расположен источник запросов... От этого зависит распределение нагрузки по ядрам. И почему именно 10 или 12 ? По числу ядер надо создавать (и клиента в том числе). Потому как увеличение количества процессов более количества ядер приведет лишь к увеличению накладных расходов на переключение и снижению быстродействия. А поскольку в асинхронном режиме нет переключения потоков, то и лишних затрат на переключение контекста нет, но это абсолютно не значит, что асинхронное быстрее. Надо выяснять реализацию, как построены фреймворки.... без этого это "гадание на кофейной гуще".

    • @vrabosh
      @vrabosh Před 3 lety

      @@user-md3nz9hy8z да ты прав.

  • @ernest.rakhmatulin
    @ernest.rakhmatulin Před 2 lety

    🔥

  • @user-ro2do2uh5y
    @user-ro2do2uh5y Před 3 lety

    Агонь.

  • @mexico76
    @mexico76 Před 3 lety

    Здравствуйте! А что вы можете сказать про asgi в django? Это ведь связано с асинхронностью, может это выход для данного фреймворка?

    • @t0digital
      @t0digital  Před 3 lety +1

      Джанго ведёт работу над переводом в асинхронность, но я не думаю, что в обозримом будущем джанго сможет стать полностью асинхронным и что вообще хочет этого

  • @Anatolii_V_Novikov
    @Anatolii_V_Novikov Před rokem

    Правильнее тестировать/измерять на реальном проекте, как есть. А синтетические тесты - как дополнение, на всякий случай (граничные случаи).

  • @user-fz5hk4xr3w
    @user-fz5hk4xr3w Před 3 lety

    Пушка

  • @poematization
    @poematization Před 3 lety +1

    В доках на aiohttp указывают, что гуникорн работает медленнее других решений. Интересно было бы увидеть тесты на это.

    • @t0digital
      @t0digital  Před 3 lety +1

      slightly, как они говорят. Без гуника настраивается - nginx и systemd, который стартует несколько процессов с aiohttp

    • @user-mr2jk1ss9d
      @user-mr2jk1ss9d Před 3 lety

      @@t0digital Насколько будет лучше если Gunicorn запустить через aiohttp.GunicornUVLoopWebWorker, а aiopg заменить на asyncpg? )

  • @PaulP738
    @PaulP738 Před 3 lety +1

    Давно думал: как можно организовать код на Джанге, используя чистую архитектуру?

  • @Bandera_tut
    @Bandera_tut Před 3 lety

    интересно-интересно, но, там же щас джанго асинхронный клепают, будет какое видео обсуждение об этом? или еще сами не пробывали тыкать туда?

    • @t0digital
      @t0digital  Před 3 lety

      Будет видео, но пока рано говорить об асинхронном джанго, и не факт, что когда-то об этом можно будет говорить полноценно

  • @user-nw4tb4ld6u
    @user-nw4tb4ld6u Před 3 lety

    Здравствуйте! У меня вопрос немного не по теме . Тут пару месяцев назад Гарвард выпустил новый курс бесплатный CS50 посвящённый веб-разаработке на JS и Python. Хотелось бы услышать ваше мнение об этом курсе.

    • @t0digital
      @t0digital  Před 3 lety +1

      Здравствуйте, не видел не проходил, но спасибо, что написали, возможно познакомлюсь

    • @gooseman5578
      @gooseman5578 Před 2 lety

      CS50 - это курс по Си. Дно, а не курс. Там подача такая, что до циклов добрались только на 5й лекции.
      И там уже от курса осталась треть сонного зала.
      czcams.com/video/SW_UCzFO7X0/video.html

  • @user-ie9yg8ff3n
    @user-ie9yg8ff3n Před 3 lety

    Non-2xx or 3xx responses: 59 - для теста с aiohttp и эмуляцией запроса в базу 200 ms. Получается, что из 100 запросов с 200 статусом вернулся ответ для 41 запроса. Я правильно понимаю?

  • @nitroflap
    @nitroflap Před 3 lety +1

    Чисто мне было бы интереснее про юнит тестинг в питоне. Ибо нагруженные сервера никто на питоне не будет делать, для этого вон есть Go, Java, C# и другие с рутинами и корутинами...

  • @user-dk9bi2ls2q
    @user-dk9bi2ls2q Před 3 lety

    Коммент. Тнеммок. Продвигаем.

  • @cyberblogru
    @cyberblogru Před 3 lety

    Слушал обсуждение этого поста в подкасте Радио-Т (кстати, заметь). Они там не особо хвалили aiopg. Говорили, что asyncpg дал бы результаты лучше

    • @t0digital
      @t0digital  Před 3 lety

      Да, возможно, опять же надо тестить

  • @user-fu4sy5bm2t
    @user-fu4sy5bm2t Před 3 lety +1

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

  • @blackcatdevel0per
    @blackcatdevel0per Před rokem

    17:57 А как же asyncqt?
    Например у меня в синхронном qt может подвисать интерфейс при выполнении какой-то задачи кнопкой и конечно я могу обойтись тредами и многопроцессорностью, но в некоторых задачах(даже не связанных с сетью) асинхронность сильно экономит ресурсы и работает лучше, но тут уже всё зависит от конкретной задачи

  • @artydevco
    @artydevco Před 3 lety

    Комментарий для продвижения!

  • @FRA1T
    @FRA1T Před 3 lety +2

    Диджитализируй! Уважаемый Алексей, с особым интересом смотрю все Ваши учебные видео-уроки и уже узнал очень много нового, за что Вам огромное человеческое спасибо! У меня есть вопрос касаемо вынесения бизнес-логики из вьюшек. Вы всё время твердите, что бизнес-логику нужно выносить в сервисы, например, с чем я очень хочу согласиться, но что делать, если вьюшки основаны на классах, а не на функциях (как во всех рассматриваемых Вами примерах)? Неужели такие методы, как get_queryset, get_context_data выкидываются? Как поступать в такой ситуации? Заранее благодарю за ответ!
    P.s. для примера вот такой метод:
    def get_queryset(self):
    return Movie.objects.all()

    • @user-rh3ji8xf5l
      @user-rh3ji8xf5l Před 3 lety

      это, мягко говоря, странно выглядит, но в рамках примера - выносите в сервисы функцию
      def get_all_movies():
      return Movie.objects.all()
      которую используйте в методах вьюхи и/или любого другого класса

    • @FRA1T
      @FRA1T Před 3 lety

      @@user-rh3ji8xf5l спасибо, но почему это странный вопрос? Обычный метод get_queryset.
      Значит, в этом методе мне нужно возвращать метод из вашего примера?
      def get_queryset(self):
      return get_all_movies()

    • @user-rh3ji8xf5l
      @user-rh3ji8xf5l Před 3 lety

      @@FRA1T вопрос не странный. в рамках примера странно (на мой взгляд) выносить что то совсем элементарное, в отдельные функции/сервисы. При наличии какой то логики (хотя бы фильтрация) - да, это имеет смысл. А так да, вы все правильно поняли, в get_queryset возвращаете вызов метода, который вынесли в services

    • @FRA1T
      @FRA1T Před 3 lety

      @@user-rh3ji8xf5l благодарю за ответ, теперь чувствую себя лучше от знаний!

  • @dmitryn.4506
    @dmitryn.4506 Před 3 lety

    Огромное спасибо за разъяснение!!! Ох уж эти холивары: придумывают синтетический тест, никак не соотносящийся с реальностью, получают какие-то результаты, не анализируют, а просто возводят в абсолют, и потом орут на весь мир, что это - гамно и это - гамно и мнение хрен оспоришь ! 😪

  • @klalafudaklalafu
    @klalafudaklalafu Před 3 lety

    14:55 ихиххихи

  • @dmitryponyatov2158
    @dmitryponyatov2158 Před 3 lety

    есть такой стек Eixir/Phoenix (язык поверх Эрланг-машины, лучшая многозадачность из всех языков) -- который специально был сделан авторами на замену Ruby/Rails
    можете по собственному опыту сравнить впечатления?

    • @dmitryponyatov2158
      @dmitryponyatov2158 Před 3 lety

      самый известный тул, написанный на Эрланг -- это RabbitMQ, известный своей эффективностью в проде

  • @liubomyr-peteliuk
    @liubomyr-peteliuk Před 3 lety

    Очень интересно смотреть такие годные вещи от человека который хайпил на том что jQuery устарел. Этим Вы и уникальны. Видео топ! ))

    • @cyberpoet
      @cyberpoet Před 3 lety

      jquery умер

    • @garrygaller2853
      @garrygaller2853 Před 3 lety

      @@cyberpoet Блин, прикинь я его только вчера видел... Живее всех живых.

    • @cyberpoet
      @cyberpoet Před 3 lety

      ​@@garrygaller2853 прямо как Ленин в мавзолее )

    • @garrygaller2853
      @garrygaller2853 Před 3 lety

      @@cyberpoet Ну Ленин, положим, просто лежит. А JQuery работает. Причем в твоем браузере, когда ты, например, поисковик открываешь. Так что рано ты старичка похоронил. Он еще и тебя переживет...

    • @cyberpoet
      @cyberpoet Před 3 lety

      @@garrygaller2853 это в каком же таком поисковике его используют? Кажись, только на говносайтиках остался.
      Если в вашей конторе пишут в 2020 на jquery и ничего не слышали ни про react, ни про angular, ни про vue или другие современные фреймворки, я вам глубоко сочувствую, но это ещё ни о чём говорит.
      Но когда-нибудь вы повзрослеете и научитесь писать код, а не эту вермишель, надеюсь!

  • @sorokousov
    @sorokousov Před 3 lety +1

    В реальности, из 100 запросов 80 будут простыми. Поэтому использовать aiohttp нужно только там, где это действительно(!) нужно.

    • @vrabosh
      @vrabosh Před 3 lety +1

      да. надо комбинировать. Некоторые запросы типа insert delete на которых работа с БД заканчивается и ответ от них не важен, можно кидать в асинхроность. Также отпавка сообщения в телеграм тоже в асинхроность.

  • @vovergg
    @vovergg Před 3 lety

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

  • @ruzin-kokoc
    @ruzin-kokoc Před 3 lety +5

    Алексей - молоток!
    Однако, хотелось бы услышать еще объяснение "почему так".
    Попробую объяснить, как сам понимаю и почему считаю, что утверждение "асинхроный код работает быстрее" - это миф.
    Допускаю, что у моего объяснения много допущений и неточностей, тем не менее.
    Процессор - один, полезную нагрузку, которую надо посчитать - одна и та же.
    Тогда с какой стати задача будет решена быстрее, если ее решать "поперек", а не "вдоль"?
    Т.е. одна задача в принципе асинхронно не может быть решена быстрее чем синхронно.
    Тогда почему говорят, что асинхронно можно решать быстрее?
    Так говорят про поток задач. Асинхронное выполнение позволяет "пропустить"
    через процессор больше задач в единицу времени.
    Всегда? Нет.
    Если задачи завязаны на процессор - нет, не позволяет.
    А если на ввод/вывод - теоретически - да.
    Если мы сразу запустим N задач - каждая из которых будет ждать ввода-вывода, то N задач
    могут выполниться параллельно быстрее, чем если их решать последовательно одну за другой.
    А какими способами можно запустить параллельное решение задач?
    - процессы
    - треды
    - event-loop с epoll (async await)
    Разница между ними в накладных расходах (и удобстве программирования).
    В двух первых из них за переключением между задачами следит ОС.
    Она же гарантирует, что каждой задаче будет уделено какое-то время.
    В последнем - за переключением следите вы сами, организуя свое приложение.
    А можно ли не использовать async await, но устроить event-loop?
    Можно, например, используя greenlet'ы greenlet.readthedocs.io/
    Какие накладные расходы?
    Запуск нового процесса это всегда:
    а) накладные расходы на память
    б) дополнительные (и не дешевые) системные вызовы.
    в) межпроцессное взаимодействие (передача задания и результатов)
    Треды чуть "легче"" и память разделяемая, но со своими "удобствами",
    например, в Python'е их сложно принудительно остановить снаружи (не из самого треда).
    Event-loop'ы самые "дешевые", но достаточно сложные в организации кода.
    Кроме всего прочего, еще нужно иметь ввиду GIL (Global Interpreter Lock),
    который не позволяет нескольким threads работать одновременно в Python.
    Касательно тестов, которые провел Алексей.
    У нас все запросы "одинаковые": запрос - пауза 200 мс - ответ.
    Async-await работает прекрасно и на одном ядре CPU можно выполнить хоть 10000 таких запросов в секунду.
    Т.е. каждый запрос потребляют 0.0001 CPU. Latency этих запросов будет ~200 мс (ожидание ввода-вывода).
    Теперь, представим себе, что каждому 100-у запросу требуется CPU на 2 секунды.
    Т.е. мы ожидаем что в среднем теперь требуется ~0.02 CPU.
    И мы можем ожидать выполнения ~50 запросов в секунду.
    Попробуем взглянуть, что произойдет с обработкой этих запросов в действительности.
    Первые 50 запросов, пришедших в первую секунду отдадутся через 200 мс, каждый.
    Вторый 50 запросов, пришедших во вторую секунду отдадутся через 200 мс, каждый,
    за исключением последнего, которые отдастся через 2 секунды.
    Третьи 50 запросов, пришедших в третью секунду отдадутся через 2 секунды, каждый,
    т.к. им придется ждать, пока 100-й запрос отдастся, а потом они смогут вернуть свой результат.
    Четвертые 50 запросов, пришедших в четвертую секунду отдадутся через 2 секунды, каждый,
    т.к. им тоже придется ждать, пока отработает 100-й запрос, А 200-й запрос задержится на 2 секунды.
    Все запросы за исключением первых 99 будут отдаваться теперь за 2 секунды вместо 200 мсек.
    Т.е. казалось бы async-await должен "помочь", но вместо этого, он "выравнивает" latency по самому медленному (запросу)
    (Строго говоря, если запросы приходят равномерно, то первые из 100 будут ждать 2 секунды,
    а последние всего около 200 мсек, т.е. в среднем все же меньше чем 2 секунды)
    Выводы:
    Я не к тому, что нельзя использовать async-await, но к тому, что написание таких обработчиков
    требует особой внимательности - ни один из них не должен быть CPU-bound - иначе все усилия
    могут потрачены впустую.
    Так надо использовать async-await? Не попробуешь - не узнаешь.
    Но если у вас разнообразные обработчики, то как минимум нужно CPU-bound обработчики
    искусственно прерывать, давая возможность "пропустить" IO-bound вперед.
    Это, в свою очередь не увеличивает читаемость кода.
    Вот пару видео от python-хакера David'а Beazley - будут полезны:
    czcams.com/video/Obt-vMVdM8s/video.html
    czcams.com/video/xOyJiN3yGfU/video.html

  • @artemhrytsenko1353
    @artemhrytsenko1353 Před 3 lety +2

    17:12 - синхронные*

  • @Spaz_Rabbit
    @Spaz_Rabbit Před 3 lety

    С I\o bound нужно юзать не трединг, мультипроцессинг, потому что треды лочатся в таких задачах из-за GIL

  • @trankov
    @trankov Před 3 lety

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

    • @yahton309
      @yahton309 Před rokem

      Однако из теории следует что ∀task speed(async_release(task)) >= speed(sync_release(task)), но это явно не всегда правда - реализация асинхронности хромает.

  • @dabuge
    @dabuge Před 3 lety +11

    Люди любят тестить нечто в вакууме. А если оно подтверждает их убеждения, так вообще прекрасно. Это просто особенность человеческого сознания. Нужно во что-то верить. Они не виноваты ))

    • @gh8499
      @gh8499 Před 3 lety

      Где-то я уже это слышал

    • @Uni-Coder
      @Uni-Coder Před 3 lety +2

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

  • @vadimalekseev3621
    @vadimalekseev3621 Před 3 lety

    Может кто-нибудь показать/рассказать как выглядят системные вызовы? Например, в Clang в unistd.h есть функция fork, но как она сообщает ОС, что от неё требуется?
    Или, например, в go есть куча системных вызовов, вокруг которых построены обертки, но как оно внутри работает? Как сделай кастомный системный вызов без оберток?

    • @victorklimov5254
      @victorklimov5254 Před 3 lety

      Как понимаю это интерфейс к ядру ОС. Те кто ОС проектируют этот интерфейс предоставляют. Как это на более низком уровне, чем на каком то ЯП написать хз.

  • @evrmk
    @evrmk Před 3 lety +1

    Как с курсом обстоят дела?

    • @t0digital
      @t0digital  Před 3 lety +1

      Образовательная программа будет, онлайн, разбитая по модулям, которые можно будет прорабатывать отдельно

  • @bladeserful
    @bladeserful Před 3 lety +1

    А почему собственно при изменении запросов заново не подобрали количество воркеров? Так как запрос выполняется долго, то процесс выполняющий запрос почти не грузит систему. Соответственно банальное увеличение количества воркеров должно сильно улучшить текущие результаты синхронных систем, да и асинхронных тоже. Я требую продолжения банкета!

  • @alexanderkukuta410
    @alexanderkukuta410 Před 3 lety

    Очень некорректный тест с pg_sleep(0.2). Для синхронного сервера получилось так, как и должно: 12 / 0.2 = 60, для асинхронного же тест некорректен, т.к. все зависит от настроек и загруженности postgresql.

    • @t0digital
      @t0digital  Před 3 lety

      Настройки pg одинаковы для обоих тестов

  • @eb6006
    @eb6006 Před 3 lety

    14:59 =))

  • @N5O1
    @N5O1 Před 10 dny

    13:32 я не питонист, но мне интересно как это работает. окей, постгрес спит 200мс прежде отдать ответ, но по какой причине произошло ускорение? что такого произошло в коде, что асинхронный код начал работать в 8 раз быстрее?

    • @t0digital
      @t0digital  Před 10 dny

      Более эффективное использование каждого ядра процессора. Когда есть ожидание 200мс ожидания ответов от сети (или какое-то иное ощутимое ожидание IO операций, не обязательно такое большое), то можно или ничего не делать в них, или обрабатывать другие HTTP-запросы в это время. Если идёт обработка других запросов - то и больший RPS получаем, requests per second, запросов в секунду

  • @dizzivoneverec2737
    @dizzivoneverec2737 Před 3 lety

    Жду когда вместо "Здоров котаны" скажет "Здоров псы" xDD

    • @t0digital
      @t0digital  Před 3 lety

      блин, тут на котанов есть люди, которые обижаются)))

  • @zshfan
    @zshfan Před 3 lety

    Супер кул! Прям вот разжовываете для самых маленьких :-)

    • @t0digital
      @t0digital  Před 3 lety +1

      Спасибо:)

    • @zshfan
      @zshfan Před 3 lety

      @@t0digital не забудьте поправить емэйл на сайте :-)

  • @artemhrytsenko1353
    @artemhrytsenko1353 Před 3 lety

    Я где-то читал, что есть практика делать несколько потоков, внутри которых работают асинхронные задачи. Насколько это эффективно?

    • @t0digital
      @t0digital  Před 3 lety

      если мы про питон, то несколько процессов, и внутри асинхронный код, тк многопоточность в питоне отстой (GIL)