scala的参与者模型如何利用C线程和本机系统线程?

戴夫

Scala的参与者模型如何利用C线程和本机系统线程?我知道编译器是可插入的,因此scala编译器替代了Java编译器。我对下一步感到困惑,是不是只是通过热点(可能不如基于线程的模型有效)将代码的中间表示优化,而是将其转换为机器代码和C的基于线程的组合。

弗拉基米尔·马特维耶夫(Vladimir Matveev)

关于Akka如何使用本机线程的非常粗略的描述如下。

  1. AkkaActor是由实例化的对象ActorSystem
  2. 然后将它们安排在上执行Dispatcher
  3. Dispatcher最终将执行委托给某人ExecutorService
  4. JVM线程的实际实现DispatcherExecutorService确定其创建和使用方式。默认情况下,使用基于fork-join池的执行程序服务。使用ForkJoinExecutorConfigurator它创建一个工厂,然后创建一个工厂ExecutorService
  5. Fork-join池Thread在内部创建几个s,并使用它们执行给定的任务。实际的执行策略并不重要;还有其他执行程序可以跨线程安排不同的任务,并且可以将Akka配置为使用它们,而不是使用默认任务。
  6. Thread是在标准库中实现的JVM级别的抽象。它使用绑定到本机库(以某种本机语言编写,如C ++或C),从而将线程管理委托给OS。
  7. 因此,当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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Symfony FosMessageBundle或OrnicarMessageBundle加载线程参与者的问题

来自分类Dev

在 Azure Service Fabric 参与者中启动线程?

来自分类Dev

Akka:如何使平衡池中的参与者数量相对于线程池大小

来自分类Dev

C# 用于增量线程参与者执行的静态公共字段

来自分类Dev

如何为多参与者对话系统建模

来自分类Dev

如何获得给定参与者系统的家庭地址

来自分类Dev

确定用例图的正确系统和参与者

来自分类Dev

endturnwithnext参与者,它是如何工作的?

来自分类Dev

关于参与者中循环和接收的scala语法理解

来自分类Dev

Akka:在参与者系统之外进行交流?

来自分类Dev

在用例图中将系统用作参与者

来自分类Dev

用例图 - 系统作为参与者

来自分类Dev

如何同步生产者线程和使用者线程[C ++ / CLI]

来自分类Dev

如何编写脚本以在 hyperledger composer 中创建新的参与者和资产?

来自分类Dev

Akka消息和参与者的命名约定

来自分类Dev

什么是等效的OpenID Connect和SAML参与者/角色?

来自分类Dev

Akka持久性查询和参与者分片

来自分类Dev

Akka启动和访问参与者返回的数据

来自分类Dev

MYSQL计数响应者和总参与者

来自分类Dev

Service Fabric 参与者、ReceiveReminderAsync 和 CancellationTokens

来自分类Dev

阿卡 如何摆脱参与者内部的业务逻辑?

来自分类Dev

如何存储要在多个参与者之间共享的数据?

来自分类Dev

如何处理参与者内的异常?

来自分类Dev

如何在MSConversation中检索参与者的姓名?

来自分类Dev

如何在TurnBasedMatch中获得自己的参与者ID?

来自分类Dev

如何从GitHub拉取请求中删除参与者?

来自分类Dev

如何在UML图中归纳参与者

来自分类Dev

如何从GitHub拉取请求中删除参与者?

来自分类Dev

如何创建两个不同的测试参与者

Related 相关文章

  1. 1

    使用Symfony FosMessageBundle或OrnicarMessageBundle加载线程参与者的问题

  2. 2

    在 Azure Service Fabric 参与者中启动线程?

  3. 3

    Akka:如何使平衡池中的参与者数量相对于线程池大小

  4. 4

    C# 用于增量线程参与者执行的静态公共字段

  5. 5

    如何为多参与者对话系统建模

  6. 6

    如何获得给定参与者系统的家庭地址

  7. 7

    确定用例图的正确系统和参与者

  8. 8

    endturnwithnext参与者,它是如何工作的?

  9. 9

    关于参与者中循环和接收的scala语法理解

  10. 10

    Akka:在参与者系统之外进行交流?

  11. 11

    在用例图中将系统用作参与者

  12. 12

    用例图 - 系统作为参与者

  13. 13

    如何同步生产者线程和使用者线程[C ++ / CLI]

  14. 14

    如何编写脚本以在 hyperledger composer 中创建新的参与者和资产?

  15. 15

    Akka消息和参与者的命名约定

  16. 16

    什么是等效的OpenID Connect和SAML参与者/角色?

  17. 17

    Akka持久性查询和参与者分片

  18. 18

    Akka启动和访问参与者返回的数据

  19. 19

    MYSQL计数响应者和总参与者

  20. 20

    Service Fabric 参与者、ReceiveReminderAsync 和 CancellationTokens

  21. 21

    阿卡 如何摆脱参与者内部的业务逻辑?

  22. 22

    如何存储要在多个参与者之间共享的数据?

  23. 23

    如何处理参与者内的异常?

  24. 24

    如何在MSConversation中检索参与者的姓名?

  25. 25

    如何在TurnBasedMatch中获得自己的参与者ID?

  26. 26

    如何从GitHub拉取请求中删除参与者?

  27. 27

    如何在UML图中归纳参与者

  28. 28

    如何从GitHub拉取请求中删除参与者?

  29. 29

    如何创建两个不同的测试参与者

热门标签

归档