170 похожих чатов

Скажите пж, правильно ли я понимаю механизм работы async/await? В асинхронной

функции всегда выполняется какая-то io-bound операция, не требующая процессорного времени. Когда мы await-им эту операцию, то поток, в котором наша функция выполнялась, отдаётся thread pool-у, чтобы тот применил его для чего-то более полезного. Потом та операция завершается, происходит прерывание, говорящее thread pool-у вернуть этот поток нашей асинхронной функции, после чего её выполнение продолжается.
Слова async await не создают дополнительных потоков, а просто рационально используют текущий.
И с cpu-bound операциями асинхронность не имеет смысла. Всё верно?

26 ответов

28 просмотров

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

Неправильно

В целом направление мысли +- верное. Но есть много нюансов.

Не в этом дело. Проблема в том, что CPU/IO-Bound и прочие тяжёлые или тормозные операции вызывают блокировку основого потока, и программа перестаёт быть отзывчивой. Чтобы это избежать и не блокировать основной поток, были придуманы асинхронные методы/функции, когда основной поток освобождается под другие нужды, а под тормозную операцию выделяется (не всегда) поток из ThreadPool'а. До оператора await код идёт синхронно, если что, а async, по сути, просто аттрибут для комилятора, чтобы дать методу поддержку асинхронных операций.

Я люблю котиков- Автор вопроса
Кирилл 😏
Не в этом дело. Проблема в том, что CPU/IO-Bound и...

То есть CLR сам может определить, требует ли операция процессорного времени, и при необходимости выделить под неё поток?

Поток не обязательно идет в пул. Будет ли выполнено на том же потоке или нет, зависит от контекста синхронизации. Там не только IO bound может быть, сам по себе Task, абстракция над задачей, а задача, может быть какой угодно

Я люблю котиков
То есть CLR сам может определить, требует ли опера...

Да. Если таска простоит больше времени, чем ей выделилось, то для неё выделится поток из ThreadPool'а. Пусть помидоры поправят ньансы.

Я люблю котиков- Автор вопроса
Phantom
Нет, CLR ничего не определяет

Тогда это делает компилятор?

Я люблю котиков
То есть CLR сам может определить, требует ли опера...

Все зависит от реализации метода, который ты вызываешь

Phantom
Поправляю, ты не прав

Конкретно. Механизм очередей и времени на исполнение тасок точно есть. Тогда что не так? 🤔

Кирилл 😏
Конкретно. Механизм очередей и времени на исполнен...

Ну ты сказал неправильные вещи, я и поправил🤷‍♂

Кирилл 😏
Конкретно. Механизм очередей и времени на исполнен...

Расскажи тогда пожалуйста, как тредпул менеджит время на исполнение таски, пожалуйста. Вот отправил ты свой делегат (таску) в очередь на тредпул. И что дальше?

Anton 『被遗忘的社会』
Расскажи тогда пожалуйста, как тредпул менеджит вр...

Тебе я точно ничего не расскажу. У тебя ToArray - это динамический масив. На этом всё 🤔

Anton 『被遗忘的社会』
ToArray это метод

Метод, который в твоём мирке, материализуется в динамический , а не статический, чья длина фиксирована 🤔. Может ничего не писать. С тобой ясно всё.

Кирилл 😏
Метод, который в твоём мирке, материализуется в ди...

Чел, иди посмотри что такое динамический и статический массив

Кирилл 😏
Метод, который в твоём мирке, материализуется в ди...

Длина статического массива должна быть известна во время компиляции

Phantom
Длина статического массива должна быть известна во...

Подожди var n = readint() var arr= new int[n]; Это динамический массив?

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта