Вопрос дизайна Threadpool - PullRequest
5 голосов
/ 14 июня 2010

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

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

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

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

Редактировать: В большинстве случаев это единственное существенное пользовательское приложение, работающее на сервере.

Ответы [ 3 ]

5 голосов
/ 14 июня 2010

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

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

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

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

  • Вам нужна нить переднего плана.
  • Требуется, чтобы поток имел определенный приоритет.
  • У вас есть задачи, из-за которых поток блокируется на длительные периоды времени. максимальное количество потоков в пуле темы, поэтому большое количество заблокировано потоки пула потоков могут помешать задачи от запуска.
  • Вам нужно разместить нити в однопоточной квартире. Все ThreadPool темы находятся в многопоточная квартира.
  • Вам необходимо иметь стабильную идентификацию, связанную с потоком, или посвятить поток задаче.
2 голосов
/ 14 июня 2010

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

Проблемы:

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

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

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

1 голос
/ 14 июня 2010

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

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

...