Cześć. Mam pytanie, w jaki sposób gorutyny tworzą współbieżność skoro nie korzystają z wątków?
Istnieją dwa rodzaje współbieżności: cooperative multitasking
oraz preemptive multitasking
.
Go wykorzystuje ten pierwszy, podczas gdy typowe systemowe wątki zazwyczaj oparte są o drugi - przy czym obydwa realizują ten sam cel (współbieżność), jedynie w inny sposób.
Ogólnie, to sprawa wygląda tak, że jest scheduler, który każdemu z kontekstów daje X czasu na wykonanie swojego zadania. Po tym X czasie (z czego pamiętam to jest to 1 milisekunda) sprawdza czy goroutine się skończyła. Jeśli nie, to odkłada sobie ją na bok i leci z kolejną goroutine. Jeśli ma 1 wątek, to robi to na 1 wątku; jak więcej to więcej :) dlatego jest to takie lekkie.
Gorutyny w Go, Coroutines w Kotlinie, WebWorkery w JS, Fiber w Scali (Cats, Scalaz, ZIO) i wisienka na torcie, która to prawdopodobnie zapoczątkowała, czyli procesy w Erlangu.
Przydałby się jakiś rząd światowy, który by ustandaryzował to nazewnictwo :/