Russian Qt Forum
Ноябрь 22, 2024, 05:40
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Многопоточное программирование, процессы
>
[Решено] Рациональное использование потоков
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: [Решено] Рациональное использование потоков (Прочитано 3839 раз)
sergek
Гипер активный житель
Offline
Сообщений: 872
Мы должны приносить пользу людям.
[Решено] Рациональное использование потоков
«
:
Август 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
Сообщений: 5876
Жаждущий знаний
Re: Рациональное использование потоков
«
Ответ #1 :
Август 21, 2020, 10:02 »
Я бы не парился - пусть живут каждый в своем потоке. Они же все равно большую часть времени спят.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
RedDog
Частый гость
Offline
Сообщений: 221
Re: Рациональное использование потоков
«
Ответ #2 :
Август 21, 2020, 18:47 »
Если вызовы API не блокирующие, то можно при запуске создать пул потоков, равный количеству ядер, а по таймерам и/или другим триггерам, раскидывать задачи на этот пул.
Записан
sergek
Гипер активный житель
Offline
Сообщений: 872
Мы должны приносить пользу людям.
Re: Рациональное использование потоков
«
Ответ #3 :
Август 25, 2020, 13:10 »
Сделал для каждой задачи свой поток, установил на промплощадке, работает. Думаю, что так и оставлю - загрузка процессора не более 7%.
Спасибо за отклики.
Записан
Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...