Шаблон для прерывистой петли с использованием актеров - PullRequest
6 голосов
/ 11 апреля 2011

Я разрабатываю актера, который потребляет предметы из бесконечного потока, и мне нужен способ контролировать, когда он запускается и останавливается, используя сообщения. Существует ли общая схема реализации таких прерывистых циклов с актерами? Я думал просто о том, чтобы мой актер отправлял сообщения самому себе. Нечто подобное (псевдо Скала):

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"
    }
  }
}

Это лучший способ идти о вещах?

Спасибо!

1 Ответ

8 голосов
/ 12 апреля 2011

Возможно закодировано так:

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
}

Приветствия

...