Вопрос о дизайне Threadpool

У меня вопрос по дизайну. Я хочу получить обратную связь, чтобы узнать, подходит ли ThreadPool для клиентской программы, которую я пишу.

У меня есть клиент, работающий как служба обработки записей базы данных. Каждая из этих записей содержит информацию о подключении к внешним FTP-сайтам [в основном это очередь файлов для передачи]. Многие из них находятся на одном хосте, просто перемещая разные файлы. Поэтому я группирую их по хостам. Я хочу иметь возможность создавать новый поток для каждого хоста. Меня действительно не волнует, когда завершатся передачи, им просто нужно выполнить всю работу (или попытаться выполнить), которую они назначили, а затем завершить работу, как только они будут завершены, очистив все ресурсы, которые они использовали в процессе.

Я предполагаю, что будет установлено не более 10-25 подключений. Когда очередь передачи пуста, программа просто будет ждать, пока в очереди снова не появятся записи.

Подходит ли ThreadPool для этого или мне следует использовать другой подход?

Изменить: по большей части это единственное значительное настраиваемое приложение, работающее на сервере.


person Bryan Crosby    schedule 14.06.2010    source источник


Ответы (3)


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

Проблемы:

  1. Поток threadpool не будет поддерживать ваш процесс при завершении работы. Убедитесь, что вы хотите именно такого поведения.

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

  3. Тот факт, что вы запускаете 10 заданий в пул потоков, не означает, что он немедленно отправит 10 потоков для выполнения работы - вы делегируете решение о том, сколько потоков использовать .net и o / s.

person JMarsch    schedule 14.06.2010
comment
+1 Согласитесь со всеми вашими рассуждениями, threadpool отлично подходит. - person Walter; 14.06.2010

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

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

В теме MSDN Управляемый пул потоков содержатся хорошие рекомендации, когда не использовать потоки пула потоков:

Существует несколько сценариев, в которых целесообразно создавать собственные потоки и управлять ими вместо использования потоков пула потоков:

  • Вам нужен поток переднего плана.
  • Вам требуется, чтобы поток имел определенный приоритет.
  • У вас есть задачи, которые вызывают блокировку потока на длительные периоды времени. Пул потоков имеет максимальное количество потоков, поэтому большое количество заблокированных потоков пула потоков может помешать запуску задач.
  • Вам нужно поместить потоки в однопоточную квартиру. Все потоки ThreadPool находятся в многопоточном апартаменте.
  • У вас должна быть стабильная идентификация, связанная с потоком, или вы должны выделить поток для задачи.
person Jeff Sternal    schedule 14.06.2010
comment
Спасибо за ваш вклад. Вы предлагаете мне просто создавать темы и управлять ими самостоятельно? - person Bryan Crosby; 14.06.2010
comment
В самом деле, создание потоков и управление ими самостоятельно - это верный путь в долгосрочной перспективе. Стоимость развертывания потоков будет незначительной по сравнению со временем передачи по FTP, что лишает нас возможности использовать одно из основных преимуществ объединения потоков (второе - это упрощенный интерфейс, который предлагает QueueUserWorkItem). - person Jeff Sternal; 14.06.2010

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

Но как вы хотите, чтобы это работало? Собираетесь ли вы поставить в очередь несколько заданий в пул для хоста или у вас будет поток для каждого хоста, который считывает задания из своей собственной очереди?

person Justin Ethier    schedule 14.06.2010
comment
Есть одна таблица базы данных для очереди, и есть столбец по имени машины. Клиентская служба будет запрашивать по собственному имени машины. Затем из этого подмножества записей (скажем, возвращено 100 записей) он будет сгруппирован по хостам (допустим, он вернул 4 уникальных хоста из коллекции 100 записей). Итак, я хотел бы, чтобы для каждого из этих хостов было запущено 4 потока в пуле. - person Bryan Crosby; 14.06.2010