использование задачи в родовом производителе / ​​потребителе - PullRequest
0 голосов
/ 26 апреля 2011


Я пытаюсь создать универсального производителя / потребителя с BlockingQueue.
Я хочу, чтобы он был как можно более многопоточным или параллельным, но при этом не использовал все ресурсы компьютера.
Допустим, у нас естьодин производитель, лучше ли при потреблении данных иметь потребителей в качестве потоков или одного пользователя с задачами?

while(true)  
{
   queue.TryTake(...) { Task.Factory.StartNew(...); }
}

или

Thread t = new Thread(Consumer.Start);

Ответы [ 2 ]

0 голосов
/ 26 апреля 2011

Может быть, комбинация.

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

Второй будет использовать только 1 поток (я полагаю, это то, что вы имеете в виду здесь).

Вы, вероятно, должны начать N потребителей и разработать некоторую стратегию для N. Это очень сильно зависит от объема работы, использования ввода-вывода и т. Д.

Возможные стратегии:

  • N = NumberOfCores (- 1)
  • Запуск нового потребителя, когда Queue.Count> M

И вы также можете использовать Задачу (с параметром LongRunning) вместо потока.

0 голосов
/ 26 апреля 2011

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

Это должно быть довольно легко настроить.

// daniel

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