我最近讀到Quasar它提供了「輕量級」 /轉到樣「用戶模式」線程到JVM(它也有一個Erlang的啓發演員系統,如阿卡,但這不是主要的問題)輕量級線程
例如:
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 /內核線程,所有在用戶模式線程完成(或使他們權利要求)的代碼,其被認爲是便宜(只是如果我的理解正確,就像Go例程一樣)
我的問題是 - 據我瞭解,在Akka中,所有東西仍然基於JVM線程,大部分時間映射到本地OS內核線程(例如, POSIX系統中的線程),例如據我所知,沒有用戶模式的線程/像Akka中的協程/輕量級線程一樣,我理解正確嗎?
如果是這樣,那麼你知道它是否是設計選擇嗎?或者未來有計劃在阿卡製造像輕量級的線程?我的理解是,如果你有一百萬個Actor,但其中大多數都是阻塞的,那麼Akka可以用更少的物理線程處理它,但是如果它們中的大多數都是非阻塞的,並且你仍然需要系統的一些響應(例如服務數百萬個用於傳輸某些數據的小型請求),那麼我可以看到用戶模式線程實現的好處,它可以讓更多的「線程」以更低的開銷和終止成本活着(當然,唯一的好處是對許多客戶均勻分配響應能力,但響應仍然很重要)
我的理解是正確的或多或少?如果我錯了,請糾正我。
*我可能完全混淆了用戶模式的線程與go/co-routines和輕量級線程,上面的問題依賴於我的不理解,他們都是相同的。
這是我從我的Python經驗中記得的。這不是一個直接的答案,但它可能是有用的。用戶/輕量級線程和實際系統線程都有其用途。歸結起來,它們都提供了併發性,但只有系統線程提供了並行性。所以如果你在進行繁重的計算,你不會從使用用戶線程獲得任何提升,但是你將從系統線程中獲益。在不同的情況下,只有一個CPU內核,並且你想要一臺服務器,使用用戶線程是唯一的解決方案。 – Andrey
是的,這也是我所理解的,例如用戶線程僅適用於提供CPU的「良好利用率」,例如,在2個用戶線程之間切換,有時會阻止IO比使用完整線程便宜。你不會得到並行性,但是如果我理解正確,你會得到更好的CPU利用率 –
請看看我的答案,它可以幫助你:http://stackoverflow.com/questions/29680718/relinquish-the-thread -cpu-until-async-call-completion-in-akka-and-java/29748613#29748613 – circlespainter