Niedawno przeczytałem o Quasar który zapewnia „lekki”/Go-like „trybu” wątki na JVM (posiada również inspirowany systemem aktora Erlang jak Akka ale nie jest to główne pytanie)Lekkie wątki w Akce
na przykład:
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
}
}
o ile mi zrozumieć powyższy kod nie tarło żadnych wątków JVM/kernel, wszystko odbywa się w wątkach trybu użytkownika (lub tak twierdzą), który ma być tańsze (tylko lubię rutynowo, jeśli dobrze rozumiem)
Moje pytanie jest takie - o ile rozumiem, w Akka wszystko jest nadal oparte na wątkach JVM, które w większości przypadków są mapami do natywnych wątków jądra systemu operacyjnego (np. pthreads w systemach POSIX), np. według mojego zrozumienia nie ma wątków trybu użytkownika/idą jak rutyny/lekkie wątki w Akka, czy dobrze rozumiałem?
Jeśli tak, to czy wiesz, że jest to wybór projektu? A może planujesz lekkie nici w Akka w przyszłości?
Rozumiem, że jeśli masz milion aktorów, ale większość z nich blokuje, to Akka może sobie z tym poradzić za pomocą znacznie mniej fizycznych wątków, ale jeśli większość z nich nie blokuje się i nadal potrzebujesz reakcji z systemu (np. usługi milionów małych wniosków o przesyłanie strumieniowe niektórych danych), wtedy widzę zalety implementacji wątków w trybie użytkownika, co pozwala na utrzymanie wielu "wątków" przy niższym koszcie tworzenia przełączania i kończenia (oczywiście jedyną korzyścią jest równomiernie rozdzielając czas reakcji dla wielu klientów, ale czas reakcji jest nadal ważny)
Czy moje zrozumienie jest poprawne? Proszę popraw mnie jeżeli się mylę.
* Mogę być całkowicie mylące wątków trybu użytkownika GO/Co-rutyny i lekkich wątków, pytanie powyżej opiera się na mojej biednej zrozumienia, że są one jednym z taka sama.
To jest to, co pamiętam z mojego doświadczenia z Pythonem. I nie jest to bezpośrednia odpowiedź, ale może być przydatna. Zarówno użytkownicy/lekkie wątki, jak i rzeczywiste wątki systemowe mają swoje zastosowania. Sprowadza się do tego, oba zapewniają współbieżność, ale tylko wątki systemowe zapewniają równoległość. Więc jeśli wykonujesz ciężkie obliczenia, nie otrzymasz żadnego wsparcia od używania wątków użytkownika, ale będziesz od wątków systemowych. W innej sytuacji, w której masz tylko jeden rdzeń procesora, a chcesz serwera, używanie wątków użytkownika jest jedynym rozwiązaniem. – Andrey
Tak, to też rozumiem, np. wątki użytkownika są dobre tylko dla zapewnienia "dobrego wykorzystania" procesora, np. przełączanie między 2 wątkami użytkownika, które czasami blokują IO są tańsze niż używanie pełnego wątku. nie uzyskujesz paralelizmu, ale masz lepsze wykorzystanie procesora, jeśli dobrze zrozumiałem. –
Proszę spojrzeć na moją odpowiedź, może to być pomocne: http://stackoverflow.com/questions/29680718/relinquish-the-thread -cpu-until-async-call-completes-in-akka-and-java/29748613 # 29748613 – circlespainter