Что происходит, когда мы используем цикл вместо while (true) с акторами scala? - PullRequest
7 голосов
/ 26 января 2011

В чем разница использования цикла вместо while (true) при использовании receive с актерами. Кажется, петля работает намного быстрее, но почему и что происходит под капотом?

Есть ли что-то плохое в использовании цикла вместо while (true)?

Подробнее о контексте. Я делаю тесты производительности в простом коде пинг / понг. И я использую прием.

Это класс Ping:

class ReceivePing(
        count : Int,
        pong : Actor
       ) extends Actor {def act() {
var pingsLeft = count - 1
pong ! Start
pong ! ReceivePing
while(true) {
  receive {
    case ReceivePong =>
      if (pingsLeft % 10000 == 0)
        Console.println("ReceivePing: pong")
      if (pingsLeft > 0) {
        pong ! ReceivePing
        pingsLeft -= 1
      } else {
        Console.println("ReceivePing: stop")
        pong ! Stop
        exit()
      }
  }
}}}

вместо while (true) он работает лучше с циклом.

Спасибо

Ответы [ 2 ]

4 голосов
/ 26 января 2011

Цикл while / receive блокирует поток , а конструкция loop / react - нет.Это означает, что первой конструкции требуется один поток на каждого актера, который быстро становится медленным.

Согласно Халлеру и Одерскому 2006 ,

Актер, ожидающий вОператор receive не представлен заблокированным потоком, а закрытием, которое фиксирует остальные вычисления актера.Закрытие выполняется после того, как субъекту отправляется сообщение, соответствующее одному из шаблонов сообщений, указанных в получении. Выполнение замыкания "поддерживается" в потоке отправителя. Если получающее замыкание завершается, управление возвращается отправителю, как если бы процедура возвращалась.Если приемное закрытие блокируется во втором приеме, управление возвращается отправителю, вызывая специальное исключение, которое раскручивает стек вызовов получателя.

(Очевидно, они позже изменили поведение receive и переименовалистарый receive до react.)

3 голосов
/ 26 января 2011

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

...