2011-04-11 26 views
6

我正在设计一个从无尽流中消耗项目的actor,并且需要一种方法来控制何时启动和停止使用消息。有没有一种通过演员来实现这种可中断循环的通用模式?我正在考虑让我的演员发送消息给自己。类似于(伪斯卡拉):使用actor的可中断循环的模式

class Interruptible extends Actor { 
    val stream: Stream 
    val running: boolean 

    def receive = { 
    case "start" => { 
     running = true 
     consumeItem 
    } 

    case "stop" => { 
     running = false 
    } 

    case "consumeNext" => consumeItem 
    } 

    def consumeItem { 
    if (running) { 
     stream.getItem 
     this ! "consumeNext" 
    } 
    } 
} 

这是关于事情的最佳方式吗?

谢谢!

+2

根据我们最新的数据阿卡做一个8core机每秒约3万条信息。你确定你没有过早地优化吗? – 2011-04-11 19:47:57

+0

感谢您的回复,Viktor。我把这个问题改为关于设计。只是试图去与演员模型交手!阿卡很棒,顺便说一句。 -D – spieden 2011-04-11 20:34:40

回答

8

也许像这样编码:

class Interruptible extends Actor { 
    val stream: Stream 

    def inactive: Receive = { // This is the behavior when inactive 
    case "start" => 
     self become active 
    } 

    def active: Receive = { // This is the behavior when it's active 
    case "stop" => 
     self become inactive 
    case "next" => 
     doSomethingWith(stream.getItem) 
     self ! "next" 
    } 

    def receive = inactive // Start out as inactive 
} 

干杯,

+0

看起来不错,谢谢。 – spieden 2011-04-12 20:51:43

+0

看起来不错,但如何“自我变得活跃”可以实施以保持优雅?在scala 2.10中找不到akka方法'成为'。或者它是一个伪代码? – dmitry 2013-04-01 18:29:48

+2

它转移到Akka 2.0的“上下文”。 http://doc.akka.io/docs/akka/2.1.2/scala/actors.html#Become_Unbecome – 2013-04-01 19:11:18