Подтвердить что ты не робот

Scala Актеры: если реакция никогда не вернется, почему она должна быть в цикле {}, и почему не работает (правда)?

Просто начните с Scala Актеров. На веб-сайте Scala говорится:

Операции блокировки потоков можно избежать, используя react для ожидания новые сообщения (кулон, основанный на событии receive). Однако существует (как правило, небольшие), чтобы заплатить: react никогда не возвращается.

...

Обратите внимание, что использование react внутри цикла while не работает! Однако, поскольку петли являются общими, для него существует специальная поддержка библиотеки в форме функции loop. Его можно использовать следующим образом:

loop {
  react {
    case A => ...
    case B => ...
  }
}

Теперь я запутался - похоже, есть противоречие:

a) Если react никогда не возвращается, то какая точка помещает его в цикл?

b) Поскольку loop многократно выполняет блок, как он отличается от while(true) - почему не работает while и каким образом он "не работает"?

4b9b3361

Ответ 1

Обе функции, loop и react не являются чистыми. loop принимает вызов по параметру name и react a PartialFunction, обе заданные переменные на сыром акторе. Это связано с тем, что у актера нет нити, прикрепленной все время. Он станет активным только тогда, когда в нем появится сообщение. Вот почему while(true) приведет к 100% -ному использованию процессора, и актер не отвечает.

Ответ 2

Я нашел объяснение, которое отвечает на часть а) моего вопроса, в одном из документов Халлера и Одерского о актерах (мой акцент ниже):

Центральная идея заключается в следующем: Актер, который ждет в приеме утверждение не представлено заблокированной нитью, а закрытием, которое захватывает остальные вычисления актера. Закрытие выполнено как только сообщение отправляется актеру, который соответствует одному из сообщений шаблоны, указанные в приеме. Выполнение закрытия \ piggy-backed "в потоке отправителя.

Если принимающее закрытие завершается, управление возвращается отправителю, как если бы процедура возвращается. Если принимающие замыкающие блоки во втором принимают, управление возвращается отправителю , бросая специальное исключение, которое разматывает стек вызовов приемника.

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