Olej писал(а):
Go легко создаёт конкурирующих и 1000 и 5000 сопрограмм, ...
Т.е. сопрограммы Go - это совсем не нативные потоки ядра!
На то, что сопрограммы Go (goroutine) не есть pthread_t наталкивает ещё и то обстоятельство, что если убрать из кода задачи, показанного выше, в завершение каждого цикла инкремента счётчика:
Код: Выделить всё
time.Sleep( 1 ) // 1 ns, но дать другим работать
Это минимальное wait-состояние (на 1 ns, но в это трудно поверить
), выполняющее фактически yeld(), переключение потока.
Но это
не корпоративная многозадачность, потому что без этой строки:
- 1-й инкрементирующий поток сразу насколько сильно вытесняет даже запускающий с его sleep(), что он завершит задачу не за 1 сек., а за 6 или 16 сек. ...
- при этом результаты счёта по инкрементирующим потокам будут как-то так:
Т.е. параллельные потоки всё-так вытесняются, но это
вытесняющая многозадачность какая-то странная ... нужно разбираться.
Очень активные и прожорливые сопрограммы.
И ещё одна их особенность, что, как я понимаю, сопрограммы не имеют такого понятия как
приоритет - они принципиально симметричные.
В теоретических статьях по параллелизму высказывались такие мнения, что параллелизм может быть надёжен и предсказуем только в симметричных условиях, при
отсутствии приоритетов. Но это - только одна точка зрения из возможных.