Трубка Ask без блокировки родительского актера - PullRequest
0 голосов
/ 30 января 2020

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

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я имею дело с ограничением ввода / вывода ask этому детскому актеру. И поскольку это сообщение теперь передается через родительский актер, родительский актор связан этими дорогостоящими запросами аск, поэтому он не может обрабатывать другие свои сообщения.

У меня есть обработчик получения, настроенный для родителя следующим образом:

Receive<GetThings>(
    message =>
    {
        GetOrCreateChildActor()
            .Ask(message)
            .PipeTo(Sender);
    }
);

Как я могу добиться передачи по этому запросу, не блокируя родительский актер?

1 Ответ

1 голос
/ 30 января 2020

Ask метод сам по себе не заблокирует ни одного актера. Все, что он делает, это служит преобразователем между передачей сообщений в стиле актера и механизмом завершения на основе задач.

Хотя ваш пример будет работать, вам не нужно использовать запрос здесь, учитывая этот конкретный пример c , Более простым решением было бы использовать Tell(message, Sender) или даже более простой Forward(message) вместо Ask - они оба отправят сообщение дочернему действующему субъекту с указанием текущего Sender в качестве отправителя этого сообщения (вместо родителя).

...