Russian Qt Forum
Апрель 23, 2024, 13:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Рациональное использование потоков  (Прочитано 3541 раз)
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« : Август 21, 2020, 08:47 »

Коллеги,
помогите, пожалуйста советом.
Моя программа-сервер выполнена в виде сервиса Linux. Главный поток - это поток веб-сервера. Он выполняет две задачи - обеспечивает веб-интерфейс для пользователей и взаимодействие с другим сервером по REST API.

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

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

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

upd. Компьютер, на чем все это работает - 64-битный 4-х ядерный ARM.
« Последнее редактирование: Август 25, 2020, 13:11 от sergek » Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Август 21, 2020, 10:02 »

Я бы не парился - пусть живут каждый в своем потоке. Они же все равно большую часть времени спят.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #2 : Август 21, 2020, 18:47 »

Если вызовы API не блокирующие, то можно при запуске создать пул потоков, равный количеству ядер, а по таймерам и/или другим триггерам, раскидывать задачи на этот пул.
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #3 : Август 25, 2020, 13:10 »

Сделал для каждой задачи свой поток, установил на промплощадке, работает. Думаю, что так и оставлю - загрузка процессора не более 7%.
Спасибо за отклики.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.103 секунд. Запросов: 22.