Как распределять потоки при асинхронном программировании?

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

Вопрос: как можно было бы спроектировать такую систему?

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

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

Можно ли подобрать оптимальный вариант?
  • Вопрос задан
  • 296 просмотров
Пригласить эксперта
Ответы на вопрос 1
@cicatrix
было бы большой ошибкой думать
То, что вы описываете, весьма подходит под классический producer/consumer pattern (производитель/потребитель) Почему-то находится мало источников на русском языке, но англоязычных - полно.
Есть и готовые реализации данного шаблона.

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы