Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: sergek от Август 21, 2020, 08:47



Название: [Решено] Рациональное использование потоков
Отправлено: sergek от Август 21, 2020, 08:47
Коллеги,
помогите, пожалуйста советом.
Моя программа-сервер выполнена в виде сервиса Linux. Главный поток - это поток веб-сервера. Он выполняет две задачи - обеспечивает веб-интерфейс для пользователей и взаимодействие с другим сервером по REST API.

В контексте веб-сервера создаются 4 объекта, которые выполняют 4 разных задачи ("вокера"). В каждом из этих объектов имеется свой отдельный таймер, запускающий с заданным интервалом выполнение своей задачи:
1) опрос через аппаратные интерфейсы периферийных устройств и получение текущих значений контролируемых параметров. Интервал опроса от 500 мс до нескольких сек.;
2) передача полученных текущих значений по REST API на другой сервер. Интервал - несколько сек.;
3) периодическая запись полученных значений в БД. Интервал - десятки сек.;
4) выполнение различных сценариев обработки параметров. Интервал - от секунд до десятков секунд.
Т.е. понятно, что каждая задача работает с различными API (портами компьютера, СУБД, сетевыми интерфейсами).

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

Вопрос - обосновано ли использование перечисленных потоков для выполнения перечисленных задач? Я пробовал и так и эдак (все задачи в главном потоке), разницы, естественно, не ощутил. Но и всех возможных условий работы веб-сервера я смоделировать не могу. Может, опыт других что-то подскажет.

upd. Компьютер, на чем все это работает - 64-битный 4-х ядерный ARM.


Название: Re: Рациональное использование потоков
Отправлено: Пантер от Август 21, 2020, 10:02
Я бы не парился - пусть живут каждый в своем потоке. Они же все равно большую часть времени спят.


Название: Re: Рациональное использование потоков
Отправлено: RedDog от Август 21, 2020, 18:47
Если вызовы API не блокирующие, то можно при запуске создать пул потоков, равный количеству ядер, а по таймерам и/или другим триггерам, раскидывать задачи на этот пул.


Название: Re: Рациональное использование потоков
Отправлено: sergek от Август 25, 2020, 13:10
Сделал для каждой задачи свой поток, установил на промплощадке, работает. Думаю, что так и оставлю - загрузка процессора не более 7%.
Спасибо за отклики.