В Golang используется кооперативная многозадачность с вытеснением.
До версии Go 1.15 использовалась исключительно кооперативная многозадачность без вытеснения.
Различия:
| Тип многозадачности | Описание |
|---|---|
| Кооперативная без вытеснения | Горутина добровольно уступает управление, вызывая блокирующие операции или runtime.Gosched(). Если горутина не уступает, другие горутины могут быть заблокированы. |
| Кооперативная с вытеснением | Планировщик может принудительно прервать выполнение горутины после некоторого времени, даже если она не выполняет блокирующую операцию. Это достигается внедрением точек прерывания в циклические конструкции. |
Пример точки прерывания в цикле (вGo компилятор внедряет их автоматически в подходящие места):
golang