Scala Актеры: если реакция никогда не вернется, почему она должна быть в цикле {}, и почему не работает (правда)?
Просто начните с Scala Актеров. На веб-сайте Scala говорится:
Операции блокировки потоков можно избежать, используя react
для ожидания новые сообщения (кулон, основанный на событии receive
). Однако существует (как правило, небольшие), чтобы заплатить: react
никогда не возвращается.
...
Обратите внимание, что использование react
внутри цикла while
не работает! Однако, поскольку петли являются общими, для него существует специальная поддержка библиотеки в форме функции loop
. Его можно использовать следующим образом:
loop {
react {
case A => ...
case B => ...
}
}
Теперь я запутался - похоже, есть противоречие:
a) Если react
никогда не возвращается, то какая точка помещает его в цикл?
b) Поскольку loop
многократно выполняет блок, как он отличается от while(true)
- почему не работает while
и каким образом он "не работает"?
Ответы
Ответ 1
Обе функции, loop
и react
не являются чистыми. loop
принимает вызов по параметру name и react
a PartialFunction, обе заданные переменные на сыром акторе. Это связано с тем, что у актера нет нити, прикрепленной все время. Он станет активным только тогда, когда в нем появится сообщение. Вот почему while(true)
приведет к 100% -ному использованию процессора, и актер не отвечает.
Ответ 2
Я нашел объяснение, которое отвечает на часть а) моего вопроса, в одном из документов Халлера и Одерского о актерах (мой акцент ниже):
Центральная идея заключается в следующем: Актер, который ждет в приеме утверждение не представлено заблокированной нитью, а закрытием, которое захватывает остальные вычисления актера. Закрытие выполнено как только сообщение отправляется актеру, который соответствует одному из сообщений шаблоны, указанные в приеме. Выполнение закрытия \ piggy-backed "в потоке отправителя.
Если принимающее закрытие завершается, управление возвращается отправителю, как если бы процедура возвращается. Если принимающие замыкающие блоки во втором принимают, управление возвращается отправителю , бросая специальное исключение, которое разматывает стек вызовов приемника.
Необходимое условие для схемы работа заключается в том, что получатели никогда не возвращают обычно своему прилагающемуся актеру. Другими словами, никакой код в актере не может зависеть от завершения или результат блока приема...