Фон: Я использую C#, но я думаю, что этот вопрос относится и к Java и Scala. У меня есть один мастер-актер, который передает все «Сообщения о работе». Эти задания могут выполняться одновременно, пока они не делятся, не используют «идентификатор параллелизма». Чтобы позаботиться об этом, я создавал одного дочернего актера для каждого «идентификатора параллелизма». Затем я использовал setReceiveTimeout для очистки детей, когда они были бездействующими.Как синхронизировать убийство ребенка Актер с помощью setReceiveTimeout в Akka
Я не могу понять, как я могу это сделать без условия гонки. Вот несколько способов, которые не работают: 1) Удалите ребенка из Словаря и сообщите ребенку о завершении. Это не работает, потому что сообщения могут быть добавлены в очередь ребенка между временем ожидания таймаута и до того, как родитель начал обрабатывать сообщение, в результате чего теряются сообщения. 2) Удалите ребенка из Словаря и отправьте PoisonPill. Это не работает, потому что ребенок может продолжить обработку новой работы. Если больше работы достигнет родителя, родитель будет создавать новый дочерний элемент, а значит, две вещи с одинаковым идентификатором параллелизма выполняются одновременно. 3) Удалите ребенка из словаря и «спросите» ребенка с сообщением. Если сообщение возвращает
Есть ли способ, которым родитель может спросить ребенка, есть ли какие-либо сообщения в очереди ребенка? (Это не было бы условием гонки, потому что все сообщения для ребенка поступают от родителя)
Может ли родитель проверить, является ли очередь ребенка пустой, а ребенок ничего не обрабатывает?
Следует ли добавить новое сообщение и «спросить» ребенка, если это сделано? (Это было бы безопасно, потому что я знаю, что родитель является единственным, кто отправляет сообщения, но есть вероятность, что это может заблокировать, если ребенок обрабатывает сообщение, или если в пуле диспетчера нет потоков.
Мой вопрос похож на этот вопрос, но я добавляю дополнительное ограничение «идентификатора параллелизма» и не беспокоюсь о «субъектах зомби», которые в настоящее время закрываются, пока зомби не имеют работы и не получат больше работы: Get or create child Akka actor and ensure liveness
Это читается как ужасный рассказ. –
@ErnodeWeerd Похоже, вы хотите, чтобы я улучшил свой вопрос, но я не уверен, что вы хотите улучшить. Можете ли вы быть более явным? –
Убийство, дети, родитель, прекращение, зомби, бассейн, яд, таблетки, жизнеспособность. Нужно ли мне сказать больше? Это может быть совершенно прекрасный вопрос, я не знаю, но это дает мне дрожь. –