Раньше я как-то неправильно представлял себе абстракции параллельного выполнения. Я думал как-то так: либо у нас есть абстракция потока, либо есть акторы, которые инкапсулируют потоки. Таким образом, нам сначала нужны, например, сопрограммы, которые будут реализовывать потоки, затем уже все остальное поверх этого.
А сейчас я подумал, можно сказать, слегка прозрел — ведь абстракция потока тут лишняя. Посудите сами. Наверное, никто не будет спорить, что реальность у нас конкурентна. одновременно вася чистит зубы, а валя гладит трусы. А разве они действуют в разных потоках? нет. все просто происходит одновременно. Любой процесс является процессом лишь потому, что мы мыслим его как процесс. На деле же это чреда разрозненных событий, происходящих одновременно.
Чтобы иметь конкурентность, потоки вообще не нужны. И легкие нити тоже не нужны. Нам просто надо убрать, по возможности, все блокирующие операции. Если мы это сделаем, у нас уже будет конкурентное исполнение. Уже поверх этого мы можем реализовать синхронизацию событий, и тогда у нас родится абстракция потока. То есть все наоборот — сначала конкурентность, а уже поверх нее потоки. В итоге, в одном единственном ивентлупе мы имем 100-процентный параллелизм, полную абстрагированность от порядка выполнения.