Как правильно в Clojure выполнять параллельную обработку, когда каждое задание обработки может выполняться в полной изоляции и может генерировать список дополнительных заданий, которые необходимо оценить?
Мои фактические Проблема - это проблема с расчетом питания, но я представлю ее в форме шахмат, которые разделяют те же черты проблемного пространства, что и мой расчет.
Предположим, например, что я пытаюсь найти все ходы матов в шахматной игре. При поиске состояний на доске я бы начал с 20 возможных состояний, каждое из которых представляет свой возможный ход открытия. Каждый из них необходимо будет оценить, принять или отклонить, а затем для каждого принятого хода будет создан новый список заданий, представляющий все возможные следующие шаги.Задания будут выглядеть следующим образом:
initial: '([] proposed-move)
accepted: '([move] proposed-response)
'([move move] proposed-response)
Число состояний для оценки растет в результате каждого вычисления, и каждое состояние можно оценивать в полной изоляции от всех остальных.
Решение, с которым я играю, выглядит следующим образом:
; a list of all final solutions, each of which is a sequence of moves
(def solutions (agent []))
; a list of all jobs pending evaluation
(def jobs (agent []))
Учитывая эти определения, у меня будет пул потоков Java, и каждый поток будет запрашивать задание у агента заданий (и ждать выполнения этого запроса). Затем он запустит расчет, сгенерирует список решений и возможных решений. Наконец, он отправит решения агенту решений, а возможные решения - агенту заданий.
Является ли использование комбинации агентов и потоков наиболее идиоматическим подходом в данном случае? Могу ли я получить данные из очереди заданий так, как я предлагаю?
Или мои задания должны быть java.util.concurrent.LinkedBlockingQueue, как описано в Потребитель-производитель с квалификацией ?