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

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 30 июня 2009

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

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

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

0 голосов
/ 30 июня 2009

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

...