2012-03-02 61 views
7

我读过akka文档,并且在使用akka时无法对线程交互产生干净的理解。 Docs可能会忽略这个东西,但它对我来说并不那么明显。akka actor如何在线程之间进行交互

所有的阿卡演员似乎都在同一个线程中运行,他们被称为。我将演员视为共同程序,每次接到呼叫时都有自己的堆栈重置。

您可以执行一系列直线切换演员。每个接收执行小的非阻塞操作并强制另一个接收进一步工作。没有事件循环,可以处理演员系统之外的消息。

我想赶上来自其他线程的请求,执行控制操作,并等待另一条消息。

有一些用例概述了我的需求。

  1. 有线程不断地轮询来自某些来源的数据。一旦数据匹配模式,它就基于actor来调用事件驱动的处理程序。逻辑控制器做出决定并将其传递给工作人员。应该有两个持久线程。一个线程在轮询中不断工作,另一个线程异步工作以控制它的工作。你不应该让akka演员第一次线程,因为他们打破了投票时间,第一个线程不应该阻止演员,所以他们需要另一个线程。

  2. 有某种双面棋盘游戏。一方拥有一个控制器线程,用于安排与电路板服务器等进行交互的计算时间。其他线程是一个沉重的计算线程遍历不同的变体和因为它已阻止自然

不能写在阿卡我意识到现有的阿卡期货,但它们代表了运行一次发射和关闭工作任务在执行他们的目标后下来。期货与akka演员很好地结合,但不能表达循环的工作线索。

Akka演员系统包含不同种类的网络事件循环。您可以使用其内置的远程参与者系统或众所周知的0mq协议。但是使用网络进行线程交互似乎对我来说过分了。

将akka线与akka线粘合起来的方法是什么?我应该写几个特殊的程序来以线程安全的方式执行消息传递吗?

+1

嗯,我不认为我们会忽略所有这些:http://akka.io/docs/akka/2.0-RC4/scala/dispatchers.html – 2012-03-04 16:38:19

+0

再一次更正:akka演员不会在相同的情况下运行他们被调用的线程,请参阅我之前对文档的评论。演员不是共同程序。 “堆栈重置”不是JVM支持的概念。 actor模型比线程更高的抽象层次。将消息传递给一个actor始终是线程安全的(参见'ActorRef.tell()') – 2012-03-04 16:48:00

+0

我建议你用apache camel集成checkout akka以便如何响应外部事件。这本书Akka Essentials http://www.packtpub。com/akka-java-applications-essentials/book对Java和Scala中大量可运行示例代码的线程模型进行了清晰的描述,以获得所有基础知识。 – simbo1905 2013-06-29 22:28:47

回答

4

如果需要轮询,那么轮询线程应该只是把无论是调查到的消息,并触发其关闭,以一个演员。

我觉得使用带有receiveTimeout的Actor以一定的间隔进行非阻塞式轮询,当有些事情被轮询时,它会将它发布给其他的actor,或者甚至是它的ActorSystems的EventStream ,为真正的酒吧 - 子行动。

+0

演员将运行什么线程?演员系统下面有什么线索用来保存自己的活动? – ayvango 2012-03-03 22:44:34

+0

在我的情况下,我使用akka通过3D查看器控制来控制摆动应用程序。所以我想要结合三个不同的事件循环,没有竞争条件和块。我需要更多关于akka系统结构的数据来构建正确的架构。 – ayvango 2012-03-04 00:08:03

+2

我们有约350页的文档:http://doc.akka.io – 2012-03-04 16:31:38

相关问题