Загрузка...

Blatant lies about asynchrony and a clear explanation

Thread in Python created by Stalkie Dec 27, 2024. 478 views

  1. Stalkie
    Stalkie Topic starter Dec 27, 2024 102 Apr 8, 2017
    Чел в теме спрашивал о разнице асинхрона и синхрона. Увидел такой ответ
    [IMG]

    Увы у многих именно такое представление об асинхроне.

    Обьясняю на пальцах. В коде есть 2 вида блокирующих функций, CPU bound и IO Bound (Input Output). Первый блокируют выполнение кода, так как ждут обработки задачи процессором компьютера как тором код запущен, к таким задачам относятся сортировки, отрисовки, поиск и другие математические операции, для которых выделяется процессорное время. IO bound задачи это те задачи, которые в основном ждут ответа (например от базы данных, или удалённого сервера через интернет). Асинхронный подход позволяет как раз таки не ждать ответа.

    Это можно сравнить с человеком который отправляет письма. К примеру у него есть 100 друзей, и он хочет всем отправить приглашение на день рождение. В синхронном подходе это выглядит так:
    1. Человек пишет письмо.
    2. Человек отправляет пиьсмо первому другу.
    3. Человек ждёт ответ.
    4. Только после получения ответа он отправляет письмо второму другу.

    В асинхронном подходе это работает так:
    1. Человек пишет письмо.
    2. Человек отправляет письмо первому другу
    3. Человек не дожидаясь ответа пишет письмо второму другу
    4. Человек отправляет письмо второму другу
    и тд до 100.
    5. Человек отправил все письма и идёт смотреть какие ответы ему пришли (на самом деле ответы могут приходить и в моменте пока он пишет письма, тогда он сможет прямо между написанием писем обрабатывать ответы)

    Или так:
    1. Человек пишет сразу 100 писем
    2. Отправляет письма по одному не дожидаясь ответа
    3. Ждёт ответов
    4. Получает сразу 100 ответов.



    Почему это не работает с CPU bound нагрузками? В этой аналогии уберём письма, есть просто человек который что то пишет. Если у нас будет 1 человек, то он может написать 1 письмо в минуту. Давай ему хоть сто бумажек сразу и проси писать по одной букве на каждой, скорость быстрее не станет, это и есть CPU bound нагрузка, человек не ждёт чего то, он всегда выполняет работу и у нас нет этого окна во время которого мы можем делать что то другое. В таком случаи нужно пригласить ещё 99 человек что бы они писали ещё 99 писем. Итого за 1 минуту они напишут 100 писем (на самом деле дольше из-за GIL).

    Основной прикол в том, что асинхронный код выполняется в 1 потоке, то есть для этого не нужно нанимать 100 человек, как в случаи с паралельностью. Сегодня такой подход является наиболее правильным для io нагрузок, ведь сразу исчезают все проблемы с GIL, с ситуациями когда 2 потока обращаются к одному адресу памяти и тд.

    Вывод: асинхронность это не паралельность. Задачи выполняются последовательно, просто пропускается огромное количество времени с ожиданием. Где это нужно? Рассмотрим 2 ситуации:
    1. Парсер каталога интернет магазина.
    Представим что есть некий каталог на 100 страниц. Нам нужно сделать 100 запросов, что бы спарсить целый каталог. В синхронном коде это будет выглядеть примерно так:
    1. Запрос к 1 странице
    2. Ожидание. (к примеру Запрос к 1 странице занимает 1 секунду)
    3. Обработка результата.
    4. Запрос к 2 странице
    и тд.
    В асинхронном подходе:
    1. Создаём список из 100 запросов.
    2. Отправляем эти 100 запросов по очереди.
    3. Ждём ответ. (всё равно 1 секунду, на самом деле немного больше, ведь мы помним, что запросы отправлялись последовательно и принимаются так же последовательно, но сами запросы идут ровно 1 секунду причём все сразу)
    4. Получаем 100 ответов и обрабатываем их все последовательно.

    2. Многопользовательский сайт.
    К примеру у нас есть сайт который предоставляет доступ пользователям для работы с нашим парсером каталогов из примера выше. Парсер у нас будет асинхронный, но вот сайт синхронный. Например сразу 2 пользователя решили создать задачу на парсинг.
    1. Первый пользователь создаёт задачу на парсинг каталога.
    2. Второй пользовтаель пытается создать, но ведь поток заблокирован первым пользователем, и второму необходимо ждать, пока задача первого будет выполнена.
    3. Зада первого выполнена спустя 30 секунд (например)
    4. Только после этого начнётся выполнение задачи второго, то есть 30 секунд пользователь ждал своей очереди.

    В аснхронном же методе нам неважно сколько пользователей будет, пока первый пользователь ждёт свои 30 секунд, мы можем сгенерировать запросы для ещё 1000 пользователей и они тоже будут ждать не блокируя поток. По итогу никакой очереди на сайте не будет, и такой сайт у которого нет никакой CPU Bound нагрузки может работать с огромным количеством пользвателей в 1 потоке.

    В случаи же когда на сайте есть CPU Bound нагрузка, уже следует разрабатывать систему очередей (к примеру на сайте который обрабатывает фотографии через ИИ, вычесления для которого выполняются в CPU/GPU на сервере). Поэтому на многих таких сайтах существует явная очередь, ведь ресурсы у сервера не бесконечные и он за 1 единицу времени может обработать какое то определённое количество фотографий. К примеру у него есть 4 потока, следовательно он может обработать 4 фотографии за единицу времени. Но если пользователей будет 5, то последний из них будет помещён в очередь на 1 место, следущий на второе и так далее.

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

    p.s. никакой агрессии к челу со скрина нет, сложно обьяснить в одном предложении работу асинхрона так, что бы не сложилось впечетление, что задачи выполняются паралельно.
     
    1. Stalkie Topic starter
      ЗЛЫЕДЕНЬГИ666, на самом деле нет, я тупой как пробка. Но когда работаешь с этим на протяжении 5 лет, то и макака разберётся
  2. ToSa
    ToSa Dec 27, 2024 guest, боже, храни кьют-рок. :beer::beer::beer: 24,038 Dec 18, 2021
    Спасибо, но буду придерживаться мнения со скрина
     
    1. Stalkie Topic starter
      ToSa, всегда пожалуйста. да это правильно, если хочется сидеть в дебаге 20 часов, то лучше придерживаться мнения со скрина
    2. ToSa
      Stalkie, к сожалению, а может и к счастью, такого не было, и на вряд ли будет
  3. АртёмДзюба
    АртёмДзюба Dec 27, 2024 Banned 2104 Nov 25, 2020
    ебать ты текста написал , отчасти согласен с тобой
     
    1. Stalkie Topic starter
  4. KUS
    KUS Dec 27, 2024 "><sVg/OnLuFy="X=y"oNloaD=;1^confirm(1)>/``^1// 11,738 Aug 22, 2020
    число
     
    1. View previous comments (7)
    2. Stalkie Topic starter
    3. АртёмДзюба
      Stalkie, ну ничего страшного, скоро в идеале будешь русский знать
    4. Stalkie Topic starter
      АртёмДзюба, не планирую его изучать больше чем знаю сейчас, мне хватает, один хуй в быту он юзелес там где я живу
  5. Тамаев
    Ну я не согласен, просто я не воспринимаю больше 5 букв
     
    1. АртёмДзюба
      Тамаев, а в аффтопике поменьше сидеть надо:))))))))))
  6. Богатый
    Богатый Dec 27, 2024 По уши в дерьме, но хотя бы есть чем его хлебать 15,070 Aug 6, 2019
    Система компьютера работает так, что все операции последовательны и идёт "переключение" с одной задачи на другую, так что о какой асинхронности может идти речь - загадка
    Ты описал правильно и я это понял как раз таки когда впервые работал с запросами по api и как раз таки чатгпт показал решение
     
    1. TheBoossya
      Богатый, только не забывай про то, сколько стоит переключение контекста)
    2. Богатый
      TheBoossya, Я вообще в этом тупой максимально)
  7. TheBoossya
    TheBoossya Dec 27, 2024 121 Aug 28, 2019
    Зря ты привел этот пример, асинхронная коммуникация - это уже немного другой уровень
    The post was merged to previous Dec 27, 2024
    Нет, тебя GIL по-прежнему ограничивает
    The post was merged to previous Dec 27, 2024
    Очень плохой пример. Тут у тебя никак не демонстрируется асинхронность
     
  8. LifeFounder
    LifeFounder Dec 27, 2024 ) 20,145 Sep 25, 2018
    Чат гпт не вывез челик
     
  9. MPoke
    MPoke Dec 27, 2024 26 Oct 8, 2022
    Есть такой слово для асинхронности "Конкурентность" , весь твой текст заменит.
     
    1. View previous comments (5)
    2. MPoke
      TheBoossya, То что я там написал " "Конкурентность" , весь твой текст заменит". Заменит размытые обьяснения , одним словом.
      А так, Асинк это одна из "форм" конкурентности и не могут быть абсолютно разными понятиями.
    3. TheBoossya
      MPoke, чего? как у тебя асинк может быть формой конкуретности, когда асинк может существовать без конкурентности?
    4. MPoke
Top
Loading...