Создать новые темы или получить больше работы для потоков - PullRequest
0 голосов
/ 31 марта 2009

У меня есть программа, которую я создаю (на C #), и я вижу два подхода ..

1) Менеджер заданий, который ожидает завершения любого количества потоков X, по завершении получает следующий кусок работы, создает новый поток и передает ему этот кусок

или

2) Мы создаем X-потоки для запуска, даем каждому из них по кусочку работы, а когда поток заканчивает работу с чанком, он запрашивает у менеджера заданий дополнительную работу. Если работы больше нет, он спит, а затем снова спрашивает, а сон становится все длиннее.

Эта программа будет запущена и готова, хотя я могу видеть, что она превращается в сервис, который постоянно ищет новые рабочие места.

Каждый блок будет состоять из нескольких идентификаторов данных, вызова базы данных для получения некоторой информации или выполнения операции с идентификатором данных, а затем записи в базу данных информации с идентификатором данных.

Ответы [ 4 ]

2 голосов
/ 31 марта 2009

Если вы знаете о дополнительных мерах предосторожности, которые необходимо соблюдать при работе с многопоточными базами данных, похоже, что вы описываете два разных сценария. Во-первых, у вас запущено несколько потоков, и как только ВСЕ из них завершат работу, он будет искать новую работу. Во втором у вас работает несколько потоков, и их операции полностью параллельны. Ваша среда будет тем, что определяет правильный подход; если что-то связывает всю работу в нескольких потоках, где дополнительная работа не может продолжаться до тех пор, пока все они не будут завершены, то с первой. Если они мало влияют друг на друга, переходите к последнему.

1 голос
/ 31 марта 2009

Первое решение (порождение потока для каждой новой части работы) проще в написании кода и не так уж плохо, если единицы работы достаточно велики.

Второе решение (пул потоков с очередью работы) более сложное для кода, но поддерживает меньшие единицы работы.

1 голос
/ 31 марта 2009

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

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

Возможно, вы захотите заглянуть в библиотеку параллельных задач. Сейчас он находится в бета-версии, но если вы можете использовать его и довольны им, я бы порекомендовал его, так как он справится с этим для вас (и гораздо лучше, учитывая количество ядер на машине, оптимальное количество потоков и т. д.)

0 голосов
/ 31 марта 2009

Вместо того, чтобы использовать собственное решение, вы должны взглянуть на класс ThreadPool в .NET Framework Вы можете использовать метод QueueUserWorkItem. Он должен делать именно то, что вы хотите достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...