Что делает функция "eventloop" в Scala Actors? - PullRequest
7 голосов
/ 11 июня 2011

Что делает функция eventloop в Scala Актеры и для чего она нужна?

Ответы [ 2 ]

9 голосов
/ 11 июня 2011

eventloop работает аналогично комбинации loop и react.Разница между loop и eventloop заключается в том, что loop, на самом деле, не вызывает рекурсивно тело (для предотвращения переполнения стека для основанных на потоках субъектов), а планирует обработку (реагирование / получение) следующего сообщенияиз почтового ящика и завершает выполнение текущего обработчика, выдавшего исключение, чтобы очистить стек вызовов.

eventloop рекурсивно обрабатывает сообщения, используя react - в случае react это безопасно (и стек не переполняется), потому что тело react (но не receive!) всегда заканчивается исключением, в большинстве случаев и запланированным следующим циклом, чтобы гарантировать справедливый доступ к пулу потоков от всех участников.Поэтому eventloop можно использовать только с актерами, управляемыми событиями.

import scala.actors._
import Actor._

class EventLoop extends Actor {
   def act = eventloop{
      case msg => println("Received " + msg)
   }
}
3 голосов
/ 11 июня 2011

Может быть эта тема может дать некоторые детали:

Одна важная мотивация для актеров заключается в том, что они позволяют вам чтобы избежать инверсии управления, что означает, что существует не более одного потока выполняется внутри актера за раз, и пользователь выбирает, когда это произойдет, написав прямую программу, которая ждет сообщения в явных точках в потоке управления.

В этой модели обычно требуется избегать передачи функций обратного вызова другим потокам, которые вызывают их асинхронно; вместо этого другие потоки должны взаимодействовать с актером только путем отправки ему сообщений. Если требуется поведение, похожее на функцию обратного вызова, то это достигается по следующей схеме потокобезопасным образом :

  def eventloop() { 
    react { 
      case Event1 => 
        // handle Event1 
        eventloop() 
      ... 
      case Eventn => 
        // handle Eventn 
        eventloop() 
    } } 

Этот шаблон представлен как абстрактная операция в Actor.eventloop:

  import scala.actors.Actor._ 

  eventloop { 
    case Event1 => 
      // handle Event1 
    case Eventn => 
      // handle Eventn 
  } 

Обратите внимание, что больше нет необходимости в хвостовых вызовах для какой-либо включающей функции.


Это, как говорится, с учетом нити датируется 2008 годом, и руководство по API Scala Actor не упоминает eventloop один раз, может быть, это не часто используется.
Васил Ременюк опытные детали eventloop использование в своего ответа (+1) и конкретный пример в вопросе " Пример клиент-сервер с актерами Scala " .

...