Здравствуйте, mrTwister, Вы писали:
T>Главное слово выделил, горутина — это внутренняя структура в go, которая не имеет никакого отношения к потокам. Это что-то типа класса Task в C#
D>>Программа на любом языке состоит из, как минимум, одного потока, который не блокирует современную многозагачную операционную сицтему.
T>Разница в том, что если, например в C# я запущу параллельно 1000 функций Thread.Sleep, то я создам и заблокирую 1000 потоков операционной системы, потому что Thread.Sleep синхронная. Если я запущу в go в горутинах 1000 функций time.Sleep, я не создам ни одного дополнительного потока операционной системы, потому что time.Sleep как и все остальные функции в go асинхронная. Аналогом time.Sleep из go является в .net Task.Delay, вот она асинхронная.
Как вызов функции foo() становится асинхронным? То, что потоки берутся из пула — это уже нюансы.
Task.Delay — и async/await — это про concurrency, который вовсе не обязательно parallelism. Вот и весь нюанс.
Простой вызов time.Sleep(1000), как и просто foo() в go блокирует текущую горутину, которая так, или иначе, выполняется на потоке (но тоток из заранее аллоцированного пула).
go time.Sleep(1000) — это асинхронно — создаём горутину и выполняем её на свободном потоке из пула, если нет, то ждём когда поток освободится. Это и есть отличие concurrency от parallelism.
Операционная система оперирует понятием "поток", а остальное — это навешанные абстракции. Чудес не бывает.
Concurrency is not parallelism