Недавно я прочитал о Quasar, который предоставляет "облегченные" / Go-подобные потоки "пользовательского режима" для JVM. (у него также есть система актеров, вдохновленная Erlang, такая как Akka, но это не главный вопрос)
Например:
package jmodern;
import co.paralleluniverse.fibers.Fiber;
import co.paralleluniverse.strands.Strand;
import co.paralleluniverse.strands.channels.Channel;
import co.paralleluniverse.strands.channels.Channels;
public class Main {
public static void main(String[] args) throws Exception {
final Channel<Integer> ch = Channels.newChannel(0);
new Fiber<Void>(() -> {
for (int i = 0; i < 10; i++) {
Strand.sleep(100);
ch.send(i);
}
ch.close();
}).start();
new Fiber<Void>(() -> {
Integer x;
while((x = ch.receive()) != null)
System.out.println("--> " + x);
}).start().join(); // join waits for this fiber to finish
}
}
Насколько я понимаю, приведенный выше код не порождает никаких потоков JVM/Kernel, все делается в потоках пользовательского режима (или так они утверждают), что должно быть дешевле (точно так же, как сопрограммы Go, если я правильно понял)
Мой вопрос заключается в следующем: насколько я понимаю, в Akka все по-прежнему основано на потоках JVM, которые в большинстве случаев сопоставляются с собственными потоками ядра ОС (например, pthreads в системах POSIX), например. насколько я понимаю, в Akka нет потоков пользовательского режима/go как co-routines/легковесных потоков, я правильно понял?
Если да, то знаете ли вы, является ли это дизайнерским выбором? или в будущем планируется создание легковесных потоков в Akka?
Насколько я понимаю, если у вас есть миллион Актеров, но большинство из них блокируются, то Akka может справиться с этим с гораздо меньшим количеством физических потоков, но если большинство из них не блокируются, и вам все еще нужна некоторая отзывчивость системы (например, обслуживание миллионов небольших запросы на потоковую передачу некоторых данных), то я вижу преимущества реализации потоковой передачи в пользовательском режиме, которая может позволить гораздо большему количеству «потоков» работать с меньшими затратами на создание переключения и завершение (конечно, единственное преимущество заключается в равномерном распределении времени отклика для клиентов много, но оперативность все же важна)
Я правильно понял более или менее? пожалуйста, поправьте меня, если я ошибаюсь.
*Я могу полностью спутать потоки пользовательского режима с go/co-routines и облегченными потоками, вопрос выше зависит от моего плохого понимания того, что все они являются одним и тем же.