2009-03-31 4 views
0

Я получил программу я создаю (в C#) и я вижу два подхода ..создавать новые темы или получить больше работы для потоков

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

или

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

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

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

+0

Чтобы прояснить подход 1, он ждет завершения потока, а затем создает новый поток и придает этому потоку больше работы, если еще предстоит сделать работу – 2009-03-31 15:06:14

+0

Учитывая это, перейдите со вторым подходом. Однако, вместо процедуры сна-проверки-сна, попросите поток запросить рабочий элемент в конце. Если его нет, пусть он спит бесконечно. Затем, в вашем координаторе, он найдет спальные потоки и сигнализирует, что один из них проснется. –

ответ

2

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

-1

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

+0

@EFrank: Если работа длительная, то это не будет хорошей идеей. – casperOne

+0

@EFrank (+1 to casperOne): класс ThreadPool использует системные потоки и предназначен для операций с коротким жизненным циклом (и довольно редким использованием). Если вы более требовательны, вы должны создавать свои собственные потоки. –

1

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

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

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

+0

Проблема с PTL заключается в том, что он максимизирует процессор, и мы больше привязаны к БД, поэтому нам необходимо более точно управлять числом. Шаблон P/C - это вариант 1, за исключением того, что вместо создания нового thr после завершения потока thr переходит в режим сна, и p ищет ожидающий thr и отправляет ему больше работы? – 2009-03-31 15:12:45

1

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

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