Вопрос по – Это плохая практика - отправлять актеру сообщение от чего-то, что не является актером?

10

Предположим, у меня есть класс, который имеет свойствоactor_ типаActor, Есть ли проблема со мной

def someMethod() = {
  actor_ ! "HELLO"
}

Или отправка сообщения всегда должна быть сделана от другого участника; например

def someMethod() = {
  Actor.actor { actor_ ! "HELLO" }
}

Ваш Ответ

2   ответа
0

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

Я не уверен. В конце концов, в реакции, что будет «отправителем» быть? oxbow_lakes
Отправителем будет неявно созданный ActorProxy, который теперь связан с отправляющим потоком.
8

ActorProxy автоматически создается и сохраняется в локальном потоке. Это создает потенциальную утечку памяти, хотя и очень маленькую, потому что ActorProxy не будет GC 'd, пока поток не станет GC' d. ActorProxy, по существу, позволяет неакторному потоку во многих отношениях вести себя как Actor, включая получение сообщения.

Большая проблема в том, что ваш поток управляется аналогично тому, как библиотека субъекта управляет потоками, так что то, что представляет логический контекст, может быть в один момент в одном потоке, а в другое - в другом потоке. Хорошим примером этого будет контейнер сервлетов. Ваш логический контекст может быть сервлетом или сеансом, но ActorProxy будет привязан к потоку и, таким образом, разделен между логическими контекстами. Если ваши актеры не отвечают на ActorProxy, это не такая уж большая проблема, но если это так, то это, вероятно, приведет к проблемам, потому что либо (а) ответы могут быть получены в неправильном контексте, либо (б) сообщения никогда не принимаются, и поэтому упомянутая ранее небольшая утечка становится большой, так как почтовые ящики ActorProxies заполняются.

[Редактировать] Хм ... Кажется, у меня проблемы с чтением! Окружение его в блоке актера создает новый объект актера, который будет надлежащим образом GC, когда он завершится. Имейте в виду, что помещение сообщения send в блок субъекта означает, что отправка сообщения будет выполнена в новой реакции в другом потоке, а не в потоке, создающем актера.

Отличный ответ, Эрик, спасибо. Оборачивает ли вызов в & quot; актер {} & quot; блок (как в моем вопросе) страдают от той же проблемы? Или созданный актер GC-способен при выходе из блока, независимо от того, продолжает ли поток работать? oxbow_lakes

Похожие вопросы