Информация об изменениях

Сообщение Re[8]: Можно ли избавиться от async|await? от 15.12.2025 7:57

Изменено 15.12.2025 8:03 mrTwister

Re[8]: Можно ли избавиться от async|await?
Здравствуйте, Doom100500, Вы писали:

D>Как вызов функции foo() становится асинхронным? То, что потоки берутся из пула — это уже нюансы.


Потому что он не блокирует поток ОС. При работе foo поток занимает, конечно, но foo не нужно дорабатывать до конца, чтобы отпустить этот поток.

D>Task.Delay — и async/await — это про concurrency, который вовсе не обязательно parallelism. Вот и весь нюанс.


Вот и любая функция в go (а так де горутины) — это тоже про concurrency, а не про параллелизм.

D>Простой вызов time.Sleep(1000), как и просто foo() в go блокирует текущую горутину, которая так, или иначе, выполняется на потоке (но тоток из заранее аллоцированного пула).


Горутину блокирует, а поток не блокирует. При вызове time.Sleep(1000) поток сразу отпускается и передается другой горутине. Тоже самое происходит при вызове Task.Delay в C#

D>go time.Sleep(1000) — это асинхронно — создаём горутину и выполняем её на свободном потоке из пула, если нет, то ждём когда поток освободится. Это и есть отличие concurrency от parallelism.


Горутина создается, но поток ОС она не потребляет, так как при вызове time.Sleep поток сразу отпускается.

D>Операционная система оперирует понятием "поток", а остальное — это навешанные абстракции. Чудес не бывает.

Ну да
Re[8]: Можно ли избавиться от async|await?
Здравствуйте, Doom100500, Вы писали:

D>Как вызов функции foo() становится асинхронным? То, что потоки берутся из пула — это уже нюансы.


Потому что он не блокирует поток ОС. При работе foo поток занимает, конечно, но foo не нужно дорабатывать до конца, чтобы отпустить этот поток.

D>Task.Delay — и async/await — это про concurrency, который вовсе не обязательно parallelism. Вот и весь нюанс.


Вот и любая функция в go (а так же горутины) — это тоже про concurrency, а не про параллелизм.

D>Простой вызов time.Sleep(1000), как и просто foo() в go блокирует текущую горутину, которая так, или иначе, выполняется на потоке (но тоток из заранее аллоцированного пула).


Горутину блокирует, а поток не блокирует. При вызове time.Sleep(1000) поток сразу отпускается и передается другой горутине. Тоже самое происходит при вызове Task.Delay в C#

D>go time.Sleep(1000) — это асинхронно — создаём горутину и выполняем её на свободном потоке из пула, если нет, то ждём когда поток освободится. Это и есть отличие concurrency от parallelism.


Горутина создается, но поток ОС она не потребляет, так как при вызове time.Sleep поток сразу отпускается.

D>Операционная система оперирует понятием "поток", а остальное — это навешанные абстракции. Чудес не бывает.

Ну да