2015-04-10 2 views
0

Фон: Я использую C#, но я думаю, что этот вопрос относится и к Java и Scala. У меня есть один мастер-актер, который передает все «Сообщения о работе». Эти задания могут выполняться одновременно, пока они не делятся, не используют «идентификатор параллелизма». Чтобы позаботиться об этом, я создавал одного дочернего актера для каждого «идентификатора параллелизма». Затем я использовал setReceiveTimeout для очистки детей, когда они были бездействующими.Как синхронизировать убийство ребенка Актер с помощью setReceiveTimeout в Akka

Я не могу понять, как я могу это сделать без условия гонки. Вот несколько способов, которые не работают: 1) Удалите ребенка из Словаря и сообщите ребенку о завершении. Это не работает, потому что сообщения могут быть добавлены в очередь ребенка между временем ожидания таймаута и до того, как родитель начал обрабатывать сообщение, в результате чего теряются сообщения. 2) Удалите ребенка из Словаря и отправьте PoisonPill. Это не работает, потому что ребенок может продолжить обработку новой работы. Если больше работы достигнет родителя, родитель будет создавать новый дочерний элемент, а значит, две вещи с одинаковым идентификатором параллелизма выполняются одновременно. 3) Удалите ребенка из словаря и «спросите» ребенка с сообщением. Если сообщение возвращает

Есть ли способ, которым родитель может спросить ребенка, есть ли какие-либо сообщения в очереди ребенка? (Это не было бы условием гонки, потому что все сообщения для ребенка поступают от родителя)

Может ли родитель проверить, является ли очередь ребенка пустой, а ребенок ничего не обрабатывает?

Следует ли добавить новое сообщение и «спросить» ребенка, если это сделано? (Это было бы безопасно, потому что я знаю, что родитель является единственным, кто отправляет сообщения, но есть вероятность, что это может заблокировать, если ребенок обрабатывает сообщение, или если в пуле диспетчера нет потоков.

Мой вопрос похож на этот вопрос, но я добавляю дополнительное ограничение «идентификатора параллелизма» и не беспокоюсь о «субъектах зомби», которые в настоящее время закрываются, пока зомби не имеют работы и не получат больше работы: Get or create child Akka actor and ensure liveness

+2

Это читается как ужасный рассказ. –

+0

@ErnodeWeerd Похоже, вы хотите, чтобы я улучшил свой вопрос, но я не уверен, что вы хотите улучшить. Можете ли вы быть более явным? –

+0

Убийство, дети, родитель, прекращение, зомби, бассейн, яд, таблетки, жизнеспособность. Нужно ли мне сказать больше? Это может быть совершенно прекрасный вопрос, я не знаю, но это дает мне дрожь. –

ответ

1

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

...

Почему, по вашему мнению, запрос блокируется?

Один из вариантов: не убивайте детей. Если у вас есть фиксированный набор идентификаторов параллелизма, которые вы используете снова и снова, просто держите всех актеров живыми. Актеры не потребляют слишком много ресурсов.

Другой вариант:

When the parent wants to kill the child: 
send a PoisonPill to the child and remove him from the Dictionary. 

When the parent receives a "job message" with concurrencyID: 
if (Dictionary.contains(concurrencyID) { 
    send message to child 
} else { 
    if (parent has child with name concurrencyID) { 
     delay message - for example with scheduler // child is terminating 
    } else { 
     create a child with name concurrencyID 
     send message to child 
    } 
} 
+0

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

+0

@PatrickM Ну ... Не делай этого! (Блокировка в Акке никогда не бывает хорошей.) – Quizzie

+0

Согласен. У меня это в качестве примера решения, которое, как я думал, было проблемой. –

Смежные вопросы