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

21 Авг 2019 в 06:23
205 +1
0
Ответы
1

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

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

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

Используя пул потоков в вашем приложении, вы сможете эффективно управлять потоками и обеспечить оптимальное распределение задач между ними.

20 Апр в 13:19
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 387 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир