Алгоритм распределения заданий с несколькими очередями Threadpool

Мне любопытно узнать, существует ли широко распространенное решение для управления ресурсами потоков в пуле потоков, учитывая следующий сценарий / ограничения:

  1. Все входящие задания одинаковы природы и может обрабатываться любым поток в пуле.
  2. Входящие вакансии будут разделены на разные очереди на основе некоторого атрибута входящая работа такая, что все вакансии переход в ту же корзину / очередь ДОЛЖЕН обрабатываться серийно.
  3. Некоторые сегменты будут менее заняты, чем другие в разные моменты во время время жизни программы.

Мой вопрос касается теории, лежащей в основе реализации пула потоков. Какой алгоритм можно использовать для эффективного распределения доступных потоков для входящих заданий по всем сегментам?

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

Edit2 : В случае, когда я думаю, существует относительно большое количество очередей (50-100) с непредсказуемыми уровнями активности, но, вероятно, только 25% из них будет активен в любой момент.

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

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

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

Я хотел бы знать, есть ли общепринятый подход. Или, если есть разные подходы - кто из них использует? Какие преимущества / недостатки и т. Д.?

Edit3 : Лучше всего это можно выразить в псевдокоде.

7
задан hifier 10 May 2011 в 03:28
поделиться