Странное / Случайное поведение, смешивающее Актеров и DaemonActors - PullRequest
1 голос
/ 31 марта 2011

Это может быть связано с предыдущим вопросом , но я не уверен .......

У меня есть подсистема на основе Scala / Actor, которая использует 3 взаимодействующих актера для выполнения некоторой работы. Каждый из актеров на самом деле является DaemonActor. Внешние сообщения отправляются первичному субъекту, а иногда сообщения отправляются второстепенным субъектом первичному субъекту с просьбой сделать что-то с данными, полученными из внешних сообщений.

Я написал Scala-программу для тестового драйвера, которая запускает подсистему, о которой идет речь, и использует DaemonActor для отправки сообщений подсистеме (то есть первичному актору).

Оказывается, что сообщения, отправленные первичному действующему субъекту, были обработаны первичным действующим субъектом, но сообщения, отправленные действующим субъектом вторичной подсистемы первичному действующему субъекту, не были обработаны.

Я обнаружил, что если я сделал Actor в программе test-driver не-Deamon Actor, а не DaemonActor, все работало бы так, как ожидалось. Это было на 100% детерминировано в том, что когда внешний тест-драйвер использовал Actor, подсистема всегда вела себя. Когда внешний тест-драйвер использует DaemonActor, подсистема всегда ведет себя неправильно. Никаких других изменений в коде не было сделано при переключении между Actors и DaemonActors.

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

Кажется довольно случайным: -)

Следует обратить внимание на одно предостережение: субъекты драйвера тестирования фактически вызывают методы в классе подсистемы, который «переводит» вызов метода в сообщение, отправляемое первичному субъекту подсистемы. Это для совместимости с кодом Java.

Я пробовал несколько разных способов узнать, обрабатываются ли сообщения. Однако я сделал это, мне нужна была информация из программы, пока она работала, и я перешел к распечатке материала. Таким образом моя ссылка на ветку вопроса о печати и очистке буферов. Единственное, что, казалось, влияло на поведение, было Actor vs. DaemonActor.

Я мог бы отправить код, но это было бы довольно много.

Любое понимание будет оценено!

Ответы [ 2 ]

0 голосов
/ 14 апреля 2011

Каков рабочий процесс вокруг DaemonActor, и вы используете Scala 2.7 или 2.8?Если вы разместите свой код в системе типа gist или pastebin, я уверен, что многие из нас будут рады посмотреть на него.:)

В 2.8 обычные субъекты предотвращают завершение времени выполнения, пока они активны;DaemonActors, как следует из названия, этого не делают.Если вы просто отправляете DaemonActor одно или несколько сообщений, а затем программа завершается, она может даже не добраться до точки отправки сообщений другим субъектам.

0 голосов
/ 31 марта 2011

Одной из возможных проблем является то, что вы не начали актеров?

...