akka actor如何在线程之间进行交互

时间:2012-03-02 22:54:35

标签: multithreading akka

我读过akka文档,但在使用akka时无法清楚地理解线程交互。文档可能会忽略这一点,但对我来说并不是那么明显。

所有akka演员似乎都在他们被称为的同一个线程中运行。我将actor视为共同程序,每次收到调用时都会重置自己的堆栈。

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

我想从其他线程捕获请求,执行控制操作,并等待另一条消息。

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

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

  2. 有一种双面棋盘游戏。一方有一个控制器线程,用于安排计算时间工作与板服务器和等等。其他线程是一个繁重的计算线程,它循环遍历不同的变体,因为它具有阻塞性,所以无法用akka编写

  3. 我知道现有的akka​​期货,但它们代表了一个工作任务,一旦被解雇并在执行目标后关闭。期货与akka演员很好地结合在一起,但无法表达循环的工作线程。

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

    将非akka线程与akka一起粘贴的假设方法是什么?我应该编写几个特殊的过程来以线程安全的方式执行消息传递吗?

1 个答案:

答案 0 :(得分:5)

如果您需要轮询,那么轮询线程应该将轮询的任何内容转换为消息并将其发送给演员。

我发现使用带有receiveTimeout的Actor以一定间隔进行非阻塞轮询更有用,当有些东西被轮询时,它会将它发布给其他actor,或者甚至是它的ActorSystems的EventStream,对于真正的pub-sub行动。