Должен ли я инкапсулировать задачу в классе? - PullRequest
3 голосов
/ 28 января 2012

Я создаю приложение, имеющее несколько долго работающих рабочих потоков, которые должны работать 24x7.Каждый работник - это метод в классе с именем Bot.Старт / Стоп Bot контролируется самим классом.Поэтому, если мне нужно 10 запущенных ботов, мне просто нужно создать экземпляр 10 Bot, сохранить в List<Bot> и запустить каждого из них.У меня также есть класс BotManager для управления всеми текущими Bot

. Теперь я хотел использовать Task вместо Thread для каждого из работников, поскольку они тратят меньшечем 5% времени занимаемся любой обработкой.

Должен ли я хранить Task в каждом классе или я должен наследовать Bot от Task?

Ответы [ 3 ]

3 голосов
/ 28 января 2012

Я бы не спустился с Task.Вы на самом деле не расширяете идею «задачи» и не делаете что-то, что для кода, который ее использует, является задачей с дополнительными функциями;вместо этого вы просто делаете что-то, что происходит с использованием задач для его реализации.

Я также не уверен, что Task подходит здесь.Если идея заключается в том, что они продолжают работать в фоновом режиме, то это не играет на сильных сторонах TPL.Лучшее время для использования Task - это когда вам нужна компоновка - четко определенная задача, которая запускается, завершается, а затем уведомляет другие задачи о том, что она выполнена, и они могут начать работу над ее результатами.

2 голосов
/ 30 января 2012

Как я понял, ваше требование - запустить как можно больше потоков, чтобы оптимизировать использование процессора.И в то же время вы хотите, чтобы фреймворк позаботился об этой обязанности по увеличению и уменьшению текущих запущенных потоков в соответствии с загрузкой ЦП.

Я бы сказал, что TPL (Задачи) будет лучшим вариантом.Пожалуйста, изучите http://msdn.microsoft.com/en-us/library/dd537609.aspx

Мы можем помочь вам больше, если вы расскажете о характере своей работы, которую вы хотите выполнять параллельно.Что именно вы подразумеваете под работающими в режиме 24X7?Какую работу выполняют ваши задачи?Это вычисления или IO (работа с БД / вызов веб-службы)?

Я предполагаю, что каждый запрос состоит из 4 шагов, и эти шаги выполняются в следующей последовательности: 1. Просмотр БД 2. Вызов веб-службы3. Обновление БД 4. Записать в файл

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

Далее вы сказали,

Процессором, интенсивно использующим процессор, будет поиск в БД

Но я понимаю, что поиск в БД не использует ЦП и является операцией ввода-вывода и, опять же, хорошим кандидатом для задачи асинхронного ввода-вывода.

Учитывая все эти предположения, я предлагаю следующее:

  1. Просмотр БД (выполняется асинхронно, чтобы поток пула потоков был освобожден для обработки других запросов)
  2. Веб-службавызов (выполняется асинхронно, так что поток пула потоков будет освобожден для обработки других запросов)
  3. Обновление БД (выполняется синхронно)
  4. Журнал в файл (используйте асинхронное ведение журнала в зависимости от содержимого журнала size)

Насколько я понимаю, ни один из ваших шагов не требует интенсивной работы ЦП, поэтому вы видите только 5% использования ЦП.

Вы также упомянули, что

сопровождается случайной задержкой для равномерного распределения нагрузки.

Вы хотели выполнить как можно больше таких запросов?(состоит из этих 4 шагов)?Если так, то вам не нужно ставить какие-либо дополнительные вещи.Потому что, когда запрос ожидает асинхронного вызова, он освобождает поток пула потоков, и система может использовать его для обработки другого запроса.Это увеличит пропускную способность.

Должен ли я сохранять Задачу в каждом классе или я должен наследовать своего Бота от Задачи?

1 Бот представляет собой 1 запрос.Задачи представляют собой шаги в запросе.Поэтому создайте задачи в своем классе BOT.

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

1 голос
/ 28 января 2012

Это определенно не «задача» для задач.Используйте темы.Когда вам нужна уверенность в том, что ваш код действительно работает (и с фиксированным количеством потоков), вы не можете использовать задачи .Задачи не гарантируют параллельное выполнение.Вы должны распределять потоки самостоятельно.Если вы хотите сэкономить ресурсы, уменьшите размер стека потоков с помощью конструктора.

...