Каковы различия между "сопрограммой" и "потоком"?
Сопрограммы - это форма последовательной обработки: в любой момент времени выполняется только одна (точно так же, как подпрограммы AKA, процедуры AKA - они просто передают эстафету друг другу более плавно).
Потоки являются (по крайней мере, концептуально) формой параллельной обработки: несколько потоков могут выполняться в любой момент времени. (Традиционно на однопроцессорных одноядерных машинах этот параллелизм моделировался с некоторой помощью ОС - в настоящее время, поскольку так много машин являются многопроцессорными и / или многоядерными, потоки будут де-факто выполняются одновременно, а не только «концептуально»).
Одним словом: упреждение. Сопрограммы действуют как жонглеры, которые постоянно передают друг другу хорошо отрепетированные пункты. Потоки (настоящие потоки) могут быть прерваны практически в любой момент, а затем возобновлены позже. Конечно, это влечет за собой всевозможные проблемы с конфликтами ресурсов, отсюда и печально известный Python GIL - Global Interpreter Lock.
Многие реализации потоков на самом деле больше похожи на сопрограммы.
Это зависит от используемого вами языка. Например, в Lua это одно и то же (переменный тип сопрограммы называется поток
).
Обычно, хотя сопрограммы реализуют добровольную уступку, где (вы) программист решает, где to yield
, т. е. передать управление другой процедуре.
Вместо этого потоки автоматически управляются (останавливаются и запускаются) ОС, и они могут даже работать одновременно на многоядерных процессорах.