gpt4 book ai didi

java - Akka 中的轻量级线程

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:15:06 25 4
gpt4 key购买 nike

我最近读到 Quasar它为 JVM 提供“轻量级”/类似 Go 的“用户模式”线程(它也有一个 Erlang 启发的 Actor 系统,比如 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/内核线程,所有这些都是在用户模式线程(或者他们声称的)中完成的,这应该更便宜(就像 Go 协程一样,如果我理解的话正确)

我的问题是——据我所知,在 Akka 中,一切仍然基于 JVM 线程,它大部分时间映射到 native 操作系统内核线程(例如 POSIX 系统中的 pthreads),例如据我所知,Akka 中没有用户模式线程/类似协程/轻量级线程,我理解正确吗?

如果是这样,那么您知道这是否是一种设计选择吗?或者将来有计划在 Akka 中使用类似 go 的轻量级线程?

我的理解是,如果你有一百万个 Actor 但其中大部分都处于阻塞状态,那么 Akka 可以使用更少的物理线程来处理它,但是如果它们中的大多数都是非阻塞的并且你仍然需要系统的一些响应(例如服务百万个流式传输一些数据的小请求)然后我可以看到用户模式线程实现的好处,它可以允许更多的“线程”以较低的创建切换和终止成本存在(当然唯一的好处是平均为许多客户划分响应度,但响应度仍然很重要)

我的理解或多或少是正确的吗?如果我错了,请纠正我。

<子>*我可能完全混淆了用户模式线程与 go/co-routines 和轻量级线程,上面的问题依赖于我对它们都是相同的理解不足。

最佳答案

Akka 是一个非常灵活的库,它允许您使用(本质上归结为通过一系列特征链)一个简单的特征来安排 actor ExecutionContext ,如您所见,它接受 Runnable 并以某种方式执行它们。因此,据我所知,很可能可以编写对类似 Quasar 的绑定(bind)并将其用作 Akka actor 的“后端”。

但是,Quasar 和类似的库可能会为光纤之间的通信提供特殊的实用程序。我也不知道他们将如何处理像 I/O 这样的阻塞任务,他们可能也有相应的机制。因此,我不确定 Akka 是否能够在绿色线程上正确运行。 Quasar 似乎也依赖于字节码检测,这是一种相当先进的技术,可能会产生很多影响,阻止它支持 Akka。

但是,在使用 Akka actor 时,您不必担心线程的轻量级问题。事实上,Akka 完全能够在单个系统上创建数百万个 actor(请参阅 here ),并且所有这些 actor 都可以正常工作。

这是通过对特殊类型的线程池进行巧妙调度来实现的,例如 fork-join 线程池。这意味着,除非 actor 在某些长时间运行的计算上被阻塞,否则它们可以运行的线程数量远少于这些 actor 的数量。例如,您可以创建一个最多使用 8 个线程(8 核处理器的每个内核一个)的线程池,所有 actor Activity 都将在这些线程上进行调度。

Akka 的灵 active 允许您配置精确的调度程序以用于特定的参与者,如果需要的话。您可以为长期运行的任务(如数据库访问)中的参与者创建专用的调度程序。参见 here获取更多信息。

所以,简而言之,不,你不需要 actor 的用户态线程,因为 actor 不会一对一映射到本地线程(除非你强制他们,也就是说,但应不惜一切代价避免这种情况)。

关于java - Akka 中的轻量级线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23415146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com