Thread → Task. Многопоточность и Асинхронность

Поділитися
Вставка
  • Опубліковано 29 січ 2025

КОМЕНТАРІ • 91

  • @ValeriiaVaganova
    @ValeriiaVaganova Рік тому +11

    как классно что видео не длится 3 часа и там четко по теме с собесов

  • @torrvic1156
    @torrvic1156 11 місяців тому +5

    Спасибо за информативность!
    Никогда не знал, что в Яве нет нормальной асинхронности. И картинка с собаками смешная :)

    • @Kulibins1
      @Kulibins1  11 місяців тому +3

      Всегда пожалуйста

  • @Anton-Os
    @Anton-Os Рік тому +6

    Спасибо огромное за разъяснение: чётко и просто. Особенно понравились картинки со стиральной машинкой- сразу стало понятно )

  • @krahmaletskrakmalets7587
    @krahmaletskrakmalets7587 2 роки тому +22

    Супер актуальное видно. Действительно, на собеседованиях очень большое внимание уделяют многопоточности и ассинхронности👍

    • @Kulibins1
      @Kulibins1  2 роки тому +4

      Рад что полезно 😉

    • @alexlightweight
      @alexlightweight 2 роки тому

      а еще вы...ываются этим очень много на собеседованиях и даже самоутверждаются )))

  • @sherzodsadiev2751
    @sherzodsadiev2751 2 роки тому +5

    Александр, большое спасибо! Очень доступно объясняете

    • @Kulibins1
      @Kulibins1  2 роки тому +4

      Рад что нравится.

  • @СалаватСеитбекуулу-ю6м

    Ничего себе. Настолько понятного объяснения ранее ещё не находил. Спасибо большое!

    • @Kulibins1
      @Kulibins1  2 роки тому +2

      Всегда пожалуйста

  • @vm7738
    @vm7738 2 роки тому +2

    Очень круто и интересно рассказано! Спасибо!

    • @Kulibins1
      @Kulibins1  2 роки тому +2

      Всегда пожалуйста 😊

  • @qwerty89993
    @qwerty89993 11 місяців тому +1

    Большое спасибо! Очень помогли

  • @vinogradova619
    @vinogradova619 2 роки тому +4

    Спасибо всё понятно и полезно 👍

    • @Kulibins1
      @Kulibins1  2 роки тому +1

      Всегда пожалуйста 😉

  • @ДмитрийСычев-б6ю
    @ДмитрийСычев-б6ю 2 роки тому +1

    Очень крутое объяснение , разобрался 👍

    • @Kulibins1
      @Kulibins1  2 роки тому +1

      Рад что понравилось 🤗

  • @vitaliyzayats
    @vitaliyzayats 2 роки тому +2

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

    • @Kulibins1
      @Kulibins1  2 роки тому +2

      Записал в список новых роликов

  • @velfex
    @velfex 2 роки тому +6

    Информативное видео! Можно немного больше кода, а так все доступно объясняете.
    И было бы здорово осветить вот эти методы и понятия: GetAwaiter /GetResult, ConfigureAwait(true/fals), SynchronizationContext

    • @Kulibins1
      @Kulibins1  2 роки тому +6

      Это все в планах на запись 😉

  • @pavelpavel7938
    @pavelpavel7938 2 роки тому +5

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

    • @Kulibins1
      @Kulibins1  2 роки тому +3

      Может быть, но суть этого видео: рассказать немного истории, и показать потоки и ассинхронность + каждый по разному одно и тоже показывает

  • @trippie7014
    @trippie7014 2 роки тому +1

    Информативное видео, спасибо

    • @Kulibins1
      @Kulibins1  2 роки тому +1

      Всегда пожалуйста

  • @trash2trash
    @trash2trash 2 роки тому +1

    Ну ждем новый видос)

  • @lolik_20
    @lolik_20 10 місяців тому +1

    1. bool complEted, а не int complited
    2. для completed можно создать публичный гетер и сделать приватный сетер

  • @trash2trash
    @trash2trash 2 роки тому +7

    Ты запутал еще больше тему.
    Task это задание, которое встает в очередь на выполнение к планировщику ThreadPool. Помогая уйти от работы с Thread классом напрямую.
    Также Task может стартануть ваш код и на отдельном Thread , который не управляется через ThreadPool.
    Выбор за вами.
    Если вспомнить как надо обсулживать входные, выходные и ошибки для Thread , то лучше переходить на Task.

    • @Kulibins1
      @Kulibins1  2 роки тому +1

      А так же task можно выполнить синхронно. Цель была рассказать как мы пришли к task и что под капотом thread

    • @trash2trash
      @trash2trash 2 роки тому +2

      @@Kulibins1 ну вводная часть путает, что и зачем создано и для каких задач использовать. Про ThreadPool вообще крохи. А ведь все ради этого механизма танцы с бубном. Чтобы использовать умный планировщик в его составе, а не городить потоки и убивать производительность процеесора.

    • @Kulibins1
      @Kulibins1  2 роки тому +1

      @@trash2trash это больше для новичков, и работу с пулом буду в отдельном видео записывать, там много тонкостей.

    • @larissasavchenko4101
      @larissasavchenko4101 6 місяців тому +1

      @@Kulibins1 и для новичков и старичков не понятно

    • @Kulibins1
      @Kulibins1  6 місяців тому +1

      @@larissasavchenko4101 я про это на собеседованиях спрашиваю - многие отвечают 🤣

  • @NeoJohnSmit
    @NeoJohnSmit Рік тому +1

    В JavaScript асинхронность работает по многопоточной модели. То есть выполнение двух асинхронных операций будет параллельной. Но асинхронность или многопточность это задача не JavaScript, а host-платформы в которой он исполняется, поскольку это скриптовый язык не имеющий ввода/вывода. В EcmaScript спецификации есть все необходимые нормы для выполнения кода в более чем один поток.

    • @Kulibins1
      @Kulibins1  Рік тому +2

      Не работает параллельно, можете привести и хоть один пример? В js event loop

    • @Kulibins1
      @Kulibins1  Рік тому +1

      @@NeoJohnSmit если вы про web worker (background worker), то это запуск отдельного процесса, со всеми вытекающими. Обычными средствами promise (под капотом постановка в очередь микрозадачь) или setTimeout(под капотом постановка в очередь макрозадачь) то оно параллельно не выполняется

    • @NeoJohnSmit
      @NeoJohnSmit Рік тому

      @@Kulibins1 Абсолютно все, что вы сейчас написали ником образом не соответствует действительности. Поэтому моя статья поможет вам разобраться.

    • @Kulibins1
      @Kulibins1  Рік тому +1

      @@NeoJohnSmit Очень хочется почитать статью. если ссылку не получается кинуть, можно скинуть не полную (без хабра) или в мою группу телеграм.

  • @ivanb8662
    @ivanb8662 2 роки тому +1

    Равзе в Java Spring @EnableAsync и @Async не тоже самое, что async/await?

    • @Kulibins1
      @Kulibins1  2 роки тому +1

      Надо посмотреть, но по моему нет. Ps: Посмотрел - это не то, какой-то кривой костыль, ну либо я не понял, но вы даже не вызовете @async из того же класса где он определён.

    • @ivanb8662
      @ivanb8662 2 роки тому

      @@Kulibins1 Так можно ua-cam.com/video/pTOQ6lJKoec/v-deo.html

  • @zergzerg4844
    @zergzerg4844 2 роки тому +2

    Я чето не понял. Если Task это надстройка над Thread то в каком потоке он будет выполнятся, если вы говорите что Task это не о многопоточности? Что-то я смысл не уловил.

    • @Kulibins1
      @Kulibins1  2 роки тому +1

      Task это надстройка, и она даёт вам возможность писать асинхронный код, как показал, поток будет браться из специального пула. Код выполняемый Task будет по факту выполняться параллельно, вы можете просто Task.Run запускать такой код, аналогичтоно Thread.Start. а в каком потоке будет код из Task выполняться вы можете посмотреть из этого кода используя Thread.CurrentThread

    • @Дзмтрый-л9в
      @Дзмтрый-л9в 2 роки тому +1

      Потому что Task - это не надстройка на Thread, а вполне отдельная тема, о чем пишут во многих англоязычных источниках. Автор чуточку заблуждается)

    • @zergzerg4844
      @zergzerg4844 2 роки тому +1

      @@Дзмтрый-л9в Если не надстройка, то обёртка или это тоже не верно?

    • @Kulibins1
      @Kulibins1  2 роки тому +1

      @@Дзмтрый-л9в Тут как раз все думают что task это отдельная тема, а на самом деле нет. На самом деле у вас нет ни какой возможности выполнять параллельный код без потоков, и task внутри себя использует потоки - то что я в этом видео и говорю. И то что с помощью него создают асинхронный код тоже рассказываю 😋

  • @june3878
    @june3878 2 роки тому +2

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

    • @Kulibins1
      @Kulibins1  2 роки тому

      Не понял, про какие велосипеды идёт речь?

    • @june3878
      @june3878 2 роки тому +1

      @@Kulibins1 ну про те, которые вы в видео упоминали. О создании своей асинхронности

  • @СерегаБ-б3н
    @СерегаБ-б3н 2 роки тому +2

    Спасибо Вам за видео! Вы не занимаетесь обучением С# случайно?)

    • @Kulibins1
      @Kulibins1  2 роки тому +2

      Всегда пожалуйста, обучением не занимаюсь - канал хобби 😉

    • @СерегаБ-б3н
      @СерегаБ-б3н 2 роки тому +1

      @@Kulibins1 Принял, спасибо!

  • @DV-og5ue
    @DV-og5ue Рік тому +1

    Картинка на 1:12 имеет отсылку к concurrency: слева параллельное выполнение, справа - конкурентное. Ничего тут плохого нет

    • @Kulibins1
      @Kulibins1  Рік тому +1

      Картинка как пример для объяснения

  • @trash2trash
    @trash2trash 2 роки тому +1

    Еще хотел сказать про потоки. Тут есть заблуждение. Потоки есть в user и kernel среде. Поток создается внутри user space и может быть переведен к kernel space.

    • @Kulibins1
      @Kulibins1  2 роки тому +1

      В этом видео я в глубину потоков не опускался.

    • @прокрастинатор-я8в
      @прокрастинатор-я8в 2 роки тому

      @@Kulibins1 либо первый раз слышу про это)

    • @Kulibins1
      @Kulibins1  2 роки тому +1

      @@прокрастинатор-я8в Тут когда вы работаете с потоками на уровне .net вы работаете с пользовательскими потоками. На данный момент в kernal среду вы попадёте при написании драйверов (в своё время на c++ делал небольшой драйвер). Так что не понял вашего вопроса/ответа

  • @glorglorsky7987
    @glorglorsky7987 4 місяці тому +1

    С собаками не совсем верная картинка, если одно ядро,то как они съедят быстрее корм, каждому собакену будет выделен квант времени процессора, и так все собаки все равно будут по очереди съедать корм

    • @Kulibins1
      @Kulibins1  4 місяці тому +1

      @@glorglorsky7987 🤣

  • @RedkeiGost
    @RedkeiGost 2 роки тому +1

    А в Java разве не виртуальная парралельность на их виртуальной машине? Или её тоже можно рассматривать как среду выполнения типа ОС? Я мимо-джаваскрипто-ангулар-мака-крокодил

    • @Kulibins1
      @Kulibins1  2 роки тому +1

      С точки зрения сравнения java и .net принцип их очень близок - есть виртуальная машина выполняющая некоторый код, не нативный, а как бы на своём языке абстрактного процессора, но в .net он компилируется в нативный, а потом выполняется, а вот в java он изначально интерпретируемый (наверное уже тоже может компилироваться)

    • @RedkeiGost
      @RedkeiGost 2 роки тому +1

      @@Kulibins1 я с джавой давно сталкивался, когда писал на nativescript. В андроиде там не оригинальная джава-машина и опять наверное свои нюансы. Мне просто немного резануло слух слово о ОС. Но опять же, я хлебушек-фронтендер, как был джавскриптчиком, так и остался. И мало ли что мне резануло.

    • @RedkeiGost
      @RedkeiGost 2 роки тому +1

      @@Kulibins1 но в джава как раз количество потоков неограничено, даже на одном ядре т.е. они виртуальные и виртуальная машина разруливает ресурсы между ними. И как раз говорили, что поток - дорогое удовольствие, лишний раз его заводить не стоит и поэтому лучше использовать паттерн ТредПулл, чтобы завести небольшое число потоков, и в них асинхронные задачи разруливать. Там таже очередь и тот же луп, что и в джаваскпит, только потоков не один.
      А вы наоборот говорите, что ТредПулл позволяет использовать максимальное количество потоков, сколько предложит система.

    • @Kulibins1
      @Kulibins1  2 роки тому +1

      @@RedkeiGost любые действия не бесплатны, и . net у вас потоков ну очень много. И java не может сделать свои потоки, потоки всегда это прерогатива OS. Тут такое дело операционка может не давать вам потоки, тогда они будут запускаться последовательно, но это только на какой-нибудь кофеварке 🤣

  • @mikhail8596
    @mikhail8596 2 роки тому +1

    Бля, это божественно, спасибо добрый человек 😊

    • @Kulibins1
      @Kulibins1  2 роки тому +2

      Всегда пожалуйста. Скоро похожее по фронту будет

  • @limeniye
    @limeniye 2 роки тому +1

    Что такое асинхронность - понятно и студенту. Я ждал разбор: как работает асинхронность. Этого не было.
    Ведь есть поток, есть таск. Таск выполяется в одном из пулла потоков асинхронно. То есть выполнение в другом потоке - не асинхронность.
    Так что же тогда такое "асинхронность" с точки зрения внутренней реализации?

    • @Kulibins1
      @Kulibins1  2 роки тому +1

      Асинхронность это больше паттерн, и с точки зрения Task он так же сделан через потоки. Асинхронность может работать когда мы даём работу другому сервису, а потом от неготполучаем результат. В результат асинхронного вычисления мы получаем через callback, и для удобства используем async await синтаксис, который является синтаксическим сахаром для callback. А то что это все понятно даже студенту, так студенты есть разные, я тут программистов видел кто рекурсию не знает 🤣

    • @limeniye
      @limeniye 2 роки тому +1

      @@Kulibins1 ну и что, что мы можем получить результат от Таска? От Потока мы тоже можем получить результат)

    • @Kulibins1
      @Kulibins1  2 роки тому +1

      @@limeniye поэтому я и говорю что асинхронность это больше паттерн. Но и многопоточность это тоже паттерн, где мы одну задачу разбиваем на куски и часто решаем её параллельно несколькими потоками. Главное что в .net асинхронность сделана через потоки, в отличии например от JS

    • @VideoContentProduction
      @VideoContentProduction 2 роки тому +1

      @@limeniye Есть определенные проблемы с обслуживанием потоков. Количество ядер процессора ограниченно, поэтому в какой то момент создание дополнительных потоков приводит снижению производительности. Чтобы обойти эту проблему придумали threadpool. Теперь рантайм сам решает какое оптимальное количество потоков можно создать. Вторая проблема в том, что получение данных происходит гораздо медленнее чем их обработка. Поэтому поток большую часть времени тупо ждет данные и ничего не делает. Чтобы решить эту проблему придумали Task. Смысл таска в том, чтобы вернуть поток в пул пока он не нужен.

  • @romanrakzin2518
    @romanrakzin2518 2 роки тому +1

    я думал - async/await сперва был в node.js - позже уже c# это перенял

    • @Kulibins1
      @Kulibins1  2 роки тому +3

      А оказалось наоборот 😉

    • @kitsunofflmao9980
      @kitsunofflmao9980 2 роки тому +1

      Однако async await под капотом в ноде это совсем другая штука, потому что нода однопоточная

    • @Kulibins1
      @Kulibins1  2 роки тому +1

      @@kitsunofflmao9980 естественно. Тут была суть в асинхронном коде. А как это реализована в разных платформах, быду в других виде рассказывай. Только в моём случае это будет не nodejs, а обычный js/ts код из Angular (браузер)

  • @ТомараСемёновна-х2и

    ♥ Спасибо за видео! Нашел видео с примером создания программы с многопоточностью ua-cam.com/video/X5AxuT5tbZ4/v-deo.html ☻

    • @Kulibins1
      @Kulibins1  Рік тому +1

      Подписался 😉

  • @nyannyan8243
    @nyannyan8243 2 роки тому +1

    "Как только в своей программе вы написали new Thread() - все кончено, ваша программа теперь содержит устаревший код. " (c) Stephen Cleary, Microsoft MVP and the author of "Concurrency in C# Cookbook"

    • @Kulibins1
      @Kulibins1  2 роки тому +2

      Понятно что сейчас всё через Task делают. Тут же рассказываю как мы к Task пришли 😁