У меня есть проблема, которую я считаю классическим шаблоном мастера/рабочего, и я ищу совета по реализации. Вот что я сейчас думаю о проблеме:
Там есть глобальная "очередь", и это центральное место, где сохраняется "работа, которая будет выполнена". Предположительно, эта очередь будет управляться каким-то "главным" объектом. Темы будут созданы, чтобы найти работу, и когда они найдут работу, они расскажут мастеру (что бы это ни было) "добавить это в очередь выполняемой работы".
Мастер, возможно, с интервалом, будет порождать другие потоки, которые фактически выполняют выполняемую работу. Как только поток завершит свою работу, я хочу, чтобы он уведомил мастера о завершении работы. Затем мастер может удалить эту работу из очереди.
В прошлом я довольно много программировал потоков на Java, но все это было до JDK 1.5, и поэтому я не знаком с соответствующими новыми API для обработки этого случая. Я понимаю, что JDK7 будет иметь fork-join, и это может быть для меня решением, но я не могу использовать продукт раннего доступа в этом проекте.
Проблемы, как я их вижу, следующие:
1), как "потоки, выполняющие работу", сообщаются ведущему, сообщая им, что их работа завершена, и что мастер теперь может удалить работу из очереди
2), как эффективно иметь гарантию мастера, что работа выполняется только один раз. Например, предположим, что эта очередь имеет миллион элементов, и она хочет сказать работнику "пойти на эти 100 вещей". Какой самый эффективный способ гарантировать, что когда он планирует работать на следующего работника, он получает "следующие 100 вещей", а не "100 вещей, которые я уже запланировал"?
3) выбор подходящей структуры данных для очереди. Мое мышление здесь состоит в том, что "работа над поисками нитей" потенциально может найти ту же работу, что и несколько раз, и они отправили бы сообщение хозяину, сказав "здесь работа", и мастер понял бы, что в работе есть уже запланированы и, следовательно, должны игнорировать сообщение. Я хочу, чтобы я выбрал правильную структуру данных, чтобы эти вычисления были как можно дешевле.
Традиционно я бы сделал это в базе данных, в виде машины с конечным состоянием, работая "задачи" от начала до конца. Однако в этой проблеме я не хочу использовать базу данных из-за большого объема и волатильности очереди. Кроме того, я хотел бы сохранить это как можно более легким. Я не хочу использовать сервер приложений, если этого можно избежать.
Весьма вероятно, что эта проблема, которую я описываю, является общей проблемой с известным именем и принятым набором решений, но я, с моей низкой степенью не-CS, не знаю, что это называется (т.е. будьте осторожны).
Спасибо за любые и все указатели.