пятница, 8 февраля 2019 г.

Go FAQ: Почему go-процедуры (goroutines) вместо потоков?

go-процедуры (goroutines) являются частью облегчения использования параллелизма. Это идея, которая существует уже довольно давно - мультиплексировать независимо исполняемые функции - сопрограммы (coroutines) - на множество потоков. Когда coroutine блокируется, например, путем вызова системного вызова блокировки, runtime (окружение среды исполнения) автоматически перемещает другие сопрограммы в том же потоке операционной системы в другой, работающий поток, чтобы они не были заблокированы. Программист не видит ничего из этого, в чем и заключается вся суть - механизм работает сам без помощи разработчика. Результат, который называют goroutines (go-процедуры), может быть очень дешевым: у него мало накладных расходов за пределами памяти для стека, который составляет всего несколько килобайт.

Чтобы сделать стеки небольшими, среда выполнения Go (runtime) использует ограниченные стеки с изменяемым размером. Недавно созданной go-процедуре дается несколько килобайт, чего почти всегда достаточно. Когда это не так, среда выполнения (runtime) Go увеличивает (и сокращает) память для хранения стека автоматически, что позволяет многим goroutines жить в скромном количестве памяти. Загрузка процессора в среднем составляет около трех дешевых инструкций на вызов функции. Практично создавать сотни тысяч go-процедур в одном адресном пространстве. Если бы go-процедуры были просто потоками, системные ресурсы истекли бы при на гораздо меньшем числе go-процедур.


Читайте также:


Комментариев нет:

Отправить комментарий