Scala的参与者模型如何利用C线程和本机系统线程?我知道编译器是可插入的,因此scala编译器替代了Java编译器。我对下一步感到困惑,是不是只是通过热点(可能不如基于线程的模型有效)将代码的中间表示优化,而是将其转换为机器代码和C的基于线程的组合。
关于Akka如何使用本机线程的非常粗略的描述如下。
Actor
是由实例化的对象ActorSystem
Dispatcher
。Dispatcher
最终将执行委托给某人ExecutorService
。Dispatcher
并ExecutorService
确定其创建和使用方式。默认情况下,使用基于fork-join池的执行程序服务。使用ForkJoinExecutorConfigurator
它创建一个工厂,然后创建一个工厂ExecutorService
。Thread
在内部创建几个s,并使用它们执行给定的任务。实际的执行策略并不重要;还有其他执行程序可以跨线程安排不同的任务,并且可以将Akka配置为使用它们,而不是使用默认任务。Thread
是在标准库中实现的JVM级别的抽象。它使用绑定到本机库(以某种本机语言编写,如C ++或C),从而将线程管理委托给OS。Thread
创建并启动对象时,最终将创建并启动本机线程,并且该线程将执行提供给该Thread
对象的代码。这是执行者如何执行的简单示意图:
Actor -> Dispatcher -> ExecutorService ----> Thread --| |--> OS thread
|--> Thread --|native code boundary|--> OS thread
\--> Thread --| |--> OS thread
您可以看到这里有几层抽象。最重要的是ExecutorService
:它完全定义了线程实例化和在这些线程上执行任务的实际策略。可以编写一个单线程执行程序服务(实际上,标准库中有一个服务),它将永远不会产生其他线程,并且有可能迫使Akka使用它。
actor的中间表示(我假设您是指Java字节代码)并未直接优化为可用于本机线程的代码,因为它们是完全不同的抽象级别:actor是非常高级的,并提供了有关执行顺序的大量保证,而线程是非常低级的,如果您希望程序正确,则必须格外小心。Akka确保线程使用正确,因此您不必自己考虑。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句