Я лише випадковий користувач Go, тому візьміть наступне із зерном солі.
Вікіпедія визначає зелені нитки як "потоки, які заплановані віртуальною машиною (VM), а не первісно базовою операційною системою". Зелені нитки емулюють багатопотокові середовища, не покладаючись на будь-які нативні можливості ОС, і ними керують у просторі користувача, а не в просторі ядра, що дозволяє їм працювати в середовищах, які не мають підтримки рідних потоків.
Перехід (або точніше дві існуючі реалізації) - це мова, що створює лише власний код - він не використовує VM. Крім того, планувальник у поточних реалізаціях виконання покладається на потоки рівня ОС (навіть коли GOMAXPROCS = 1). Тож я думаю, що говорити про зелені нитки для моделі Go трохи зловживає.
Люди придумали термін goroutter, особливо щоб уникнути плутанини з іншими механізмами одночасності (такими як супроводи або потоки чи легкі процеси).
Звичайно, Go підтримує модель різьблення M: N, але вона виглядає набагато ближче до моделі процесу Ерланг, ніж до моделі зелених ниток Java.
Ось кілька переваг моделі Go над зеленими нитками (як реалізовано на початку JVM):
Кілька ядер або процесорів можна ефективно використовувати прозоро для розробника. З Go, розробник повинен подбати про одночасність. Пробіг Go подбає про паралелізм. Реалізація зелених ниток Java не розширюється на декілька ядер чи процесорів.
Системні та виклики C не блокують планувальника (усі системні виклики, не тільки ті, що підтримують мультиплексоване введення / виведення у циклі подій). Реалізація зелених ниток може блокувати весь процес, коли було здійснено блокування виклику системи.
Копіювання або сегментування стеків. У програмі Go немає необхідності вказувати максимальний розмір стека для програми. Стек зростає поступово по мірі необхідності. Одним із наслідків є те, що програма не вимагає великої кількості пам'яті (4 КБ-8 КБ), тому величезна кількість з них може бути щасливо породжена. Тому використання програмних засобів може бути широко поширеним.
Тепер, щоб вирішити критику:
За допомогою Go вам не потрібно писати планувальник простору користувачів: він уже забезпечений під час виконання. Це складне програмне забезпечення, але це проблема розробників Go, а не користувачів Go. Його використання прозоре для користувачів Go. Серед розробників Go, Дмитро Вюков є експертом у програмі програмування безвізних / чекань, і він, схоже, особливо зацікавлений у вирішенні можливих проблем планувальника. Поточна реалізація планувальника не є досконалою, але вона покращиться.
Синхронізація приносить проблеми та складність продуктивності: частково це стосується і Go. Але зауважте, що модель Go намагається сприяти використанню каналів та чистому розкладу програми в паралельних програмах для обмеження складності синхронізації (тобто обмін даними шляхом спілкування, а не обмін пам'яттю для спілкування). До речі, довідкова реалізація Go надає низку інструментів для вирішення проблем продуктивності та одночасності, як-от профілер та детектор гонки .
Щодо помилок сторінки та "підроблених декількох потоків", будь ласка, зверніть увагу, що Go може запланувати програму для декількох системних потоків. Якщо з будь-якої причини блокується один потік (помилка сторінки, блокування системних викликів), це не заважає іншим потокам продовжувати планувати та виконувати інші програми. Тепер, правда, що помилка сторінки блокує потік ОС, при цьому всі гарантії повинні бути заплановані на цьому потоці. Однак на практиці пам'ять Go heap не має бути заміненою. Це було б те саме в Java: зібрані сміття мови все одно не вміщують віртуальну пам'ять. Якщо ваша програма повинна граціозно поводитись з помилками сторінки, якщо це, мабуть, тому, що вона має керувати якоюсь невичерпною пам'яттю. В такому разі,
Таким чином, IMO, гороутини не є зеленими нитками, а мова Go і поточна реалізація здебільшого вирішують ці критики.