Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Akka中的轻质螺纹_Java_Multithreading_Scala_Akka_Quasar - Fatal编程技术网

Java Akka中的轻质螺纹

Java Akka中的轻质螺纹,java,multithreading,scala,akka,quasar,Java,Multithreading,Scala,Akka,Quasar,我最近读到了关于向JVM提供“轻量级”/“用户模式”线程的文章(它还有一个类似于Akka的Erlang的Actor系统,但这不是主要问题) 例如: package jmodern; import co.paralleluniverse.fibers.Fiber; import co.paralleluniverse.strands.Strand; import co.paralleluniverse.strands.channels.Channel; import co.paralleluni

我最近读到了关于向JVM提供“轻量级”/“用户模式”线程的文章(它还有一个类似于Akka的Erlang的Actor系统,但这不是主要问题)

例如:

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
    }
}
包jmodern;
进口公司;纤维;纤维;
进口公司paralleluniverse.Strans.Strand;
导入co.paralleluniverse.streams.channels.Channel;
导入co.paralleluniverse.threads.channels.channels;
公共班机{
公共静态void main(字符串[]args)引发异常{
最终通道ch=通道。新通道(0);
新光纤(()->{
对于(int i=0;i<10;i++){
睡眠(100);
钱其琛(i);
}
ch.close();
}).start();
新光纤(()->{
整数x;
而((x=ch.receive())!=null)
System.out.println(“-->”+x);
}).start().join();//join等待此光纤完成
}
}
据我所知,上面的代码不会产生任何JVM/内核线程,所有这些都是在用户模式线程(或者他们声称的那样)中完成的,这应该更便宜(如果我理解正确,就像Go-co例程一样)

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

如果是的话,那么你知道这是否是一种设计选择吗?或者在未来的Akka有一个类似go的轻量级线程的计划

我的理解是,如果您有一百万个参与者,但其中大多数是阻塞的,那么Akka可以用更少的物理线程处理它,但是如果大多数参与者是非阻塞的,并且您仍然需要系统的一些响应(例如,为流式传输某些数据的数百万个小请求提供服务)然后,我可以看到用户模式线程实现的好处,它可以让更多的“线程”保持活动状态,同时降低创建切换和终止的成本(当然,唯一的好处是对许多客户端的响应能力进行平均分配,但响应能力仍然很重要)

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


*我可能完全混淆了用户模式线程与go/co例程和轻量级线程,上面的问题在于我对它们都是同一个的理解不足。

Akka是一个非常灵活的库,它允许您使用(本质上可以归结为通过一系列特征)一个简单的特征来安排参与者,如您所见,接受
Runnable
s并以某种方式执行它们。所以,就我所见,很可能可以编写一个与类星体之类的东西的绑定,并将其用作Akka参与者的“后端”

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

然而,在使用Akka actors时,您不应该真正担心线程的轻量级。事实上,Akka完全能够在单个系统上创建数百万个角色(请参阅),所有这些角色都可以正常工作


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

Akka灵活性允许您配置精确的调度器,以便在需要时用于特定的参与者。您可以为长期运行任务(如数据库访问)中的参与者创建专用调度程序。有关更多信息,请参阅


因此,简而言之,不需要,参与者不需要用户线程,因为参与者不需要将一对一映射到本机线程(除非您强制它们,但这应该不惜一切代价加以避免)。

Akka参与者本质上是异步的,这就是为什么您可以有很多参与者,而Quasar参与者(是的,Quasar也提供了一个actors实现),非常接近Erlang,是同步的或阻塞的,但它们使用光纤而不是Java(即目前的操作系统)线程,所以仍然可以有很多线程,它们的性能与异步相同,但编程风格与使用常规线程和阻塞调用时一样简单

I/O是通过集成来处理的:并且包括许多这样的集成(一个带有Java NIO的集成直接包含在Quasar中)


包含进一步的信息。

这是我从Python的经验中记得的。这不是一个直接的答案,但可能很有用。用户/轻量级线程和实际系统线程都有它们的用途。归结起来,两者都提供并发性,但只有系统线程提供并行性。因此,如果您正在进行大量计算,您可以不会从使用用户线程中得到任何提升,但会从系统线程中得到提升。在不同的情况下,如果您只有一个CPU核心,并且想要一台服务器,则使用用户线程是唯一的解决方案。是的,这也是我所理解的,例如,用户线程只适合提供“良好的利用率”例如,在2个用户线程之间切换,有时会阻塞IO,这比使用完整线程要便宜。你不会获得并行性,但你会获得更好的利用率