Мне любопытно узнать, существует ли широко распространенное решение для управления ресурсами потоков в пуле потоков с учетом следующего сценария / ограничений:
- Входящие вакансии одинаковы
природа и может быть обработана любым
нить в бассейне.
- Входящие вакансии
будут «сгруппированы» в разные
очереди, основанные на некотором атрибуте
входящая работа такая, что все рабочие места
ДОЛЖЕН идти в ту же корзину / очередь
обрабатываться серийно.
- Некоторые ведра будут менее заняты, чем
другие в разных точках во время
время жизни программы.
Мой вопрос касается теории реализации пула потоков. Какой алгоритм можно использовать для эффективного распределения доступных потоков для входящих заданий во всех сегментах?
Редактировать : Еще одной целью разработки было бы устранить как можно большую задержку между помещением в очередь задания и его получением для обработки, предполагая, что имеются свободные незанятые потоки.
Edit2 : В случае, если я имею в виду, существует относительно большое количество очередей (50-100), которые имеют непредсказуемые уровни активности, но, вероятно, только 25% из них будут активны в в любой момент времени.
Первое (и наиболее дорогостоящее) решение, о котором я могу подумать, - это просто назначить 1 поток каждой очереди. Хотя это обеспечит немедленный прием входящих запросов, это явно неэффективно.
Второе решение состоит в том, чтобы объединить очереди вместе на основе ожидаемых уровней активности, чтобы количество очередей соответствовало количеству потоков в пуле, позволяя назначить один поток каждой очереди. Проблема здесь будет в том, что входящие задания, которые в противном случае могли бы обрабатываться параллельно, будут вынуждены ждать друг друга.
Третье решение - создать максимальное количество очередей, по одной для каждого набора заданий, которые должны обрабатываться последовательно, но распределять потоки только на основе количества очередей, которые мы ожидаем быть занятыми в любой момент времени (что также может быть настроенным бассейном во время выполнения). Так что вот в чем заключается мой вопрос: учитывая, что у нас больше очередей, чем потоков, как пул может распределять свободные потоки для входящих заданий наиболее эффективным способом?
Я хотел бы знать, существует ли широко принятый подход. Или, если есть разные подходы - кто использует какой? Каковы преимущества / недостатки и т. Д.?
Edit3 : Это может быть лучше всего выражено в псевдокоде.