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

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

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

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

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

2 ответа

Решение

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

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

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

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

Другие вопросы по тегам