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