Russian Qt Forum

Qt => Общие вопросы => Тема начата: qate от Январь 29, 2015, 12:33



Название: сколько потоков следует использовать
Отправлено: qate от Январь 29, 2015, 12:33
продумываю архитектуру приложения (обмен с сетевыми устройствами, типа опрос)
удобным видится использование множества потоков (т.е. 1 поток на работу по устройству)
но если устройств много, то и количество потоков растет (обычно до 100 устройств, но ограничу в 500)
тест QThread показал что можно создать 490 потоков, а если сделать setStackSize(PTHREAD_STACK_MIN), то чуть более 1000 (но там уже на общее количество открытых файлов ограничение, наверно можно увеличить)

стоит ли отказаться от такой архитектуры и выдумывать очередь на все устройства, работающею из одного потока ?


Название: Re: сколько потоков следует использовать
Отправлено: Bepec от Январь 29, 2015, 12:46
А я ещё больше вас разочарую - примерное количество потоков в одном процессе не более 100. Более точная цифра зависит от ОС/железа. К примеру i7 на Win 7 в полной комплектации позволяет только 63 потока.

не страдайте. Обмен с сетевыми устройствами-опрос можно делать в одном потоке, одним менеджером. Тот же опрос по очереди будет не менее эффективен.

PS а как вы QThread проверяли? Пустых насоздавали?


Название: Re: сколько потоков следует использовать
Отправлено: Old от Январь 29, 2015, 12:56
А я ещё больше вас разочарую - примерное количество потоков в одном процессе не более 100. Более точная цифра зависит от ОС/железа. К примеру i7 на Win 7 в полной комплектации позволяет только 63 потока.
Что за глупости? :)



Название: Re: сколько потоков следует использовать
Отправлено: Bepec от Январь 29, 2015, 13:05
Небольшая неточность - это для x86 процесса.
А так вот статейка для ознакомления - http://blogs.technet.com/b/mark_russinovich/archive/2009/11/02/3290815.aspx


Название: Re: сколько потоков следует использовать
Отправлено: Old от Январь 29, 2015, 13:07
Небольшая неточность - это для x86 процесса.
А что именно вы этим уточнили? :)

Это глупости и для x86:
А я ещё больше вас разочарую - примерное количество потоков в одном процессе не более 100. Более точная цифра зависит от ОС/железа. К примеру i7 на Win 7 в полной комплектации позволяет только 63 потока.


Название: Re: сколько потоков следует использовать
Отправлено: qate от Январь 29, 2015, 13:07
PS а как вы QThread проверяли? Пустых насоздавали?

QThread и класс к нему который в нем живет
но проблема именно в создании - в коде QThread где вызов pthread_create, уменьшил стек - стало получше

очередь мутно городить, повторы всякие, вот потому и не хочу ее делать (не говорю что нельзя)



Название: Re: сколько потоков следует использовать
Отправлено: Old от Январь 29, 2015, 13:09
очередь мутно городить, повторы всякие, вот потому и не хочу ее делать (не говорю что нельзя)
Все равно, делать столько потоков не нужно.
Работы для них никакой нет, а ресурсы на переключение будут тратится много.
Сделайте несколько ниток, например, по одной нитке на 50 - 100 устройств.


Название: Re: сколько потоков следует использовать
Отправлено: Old от Январь 29, 2015, 13:17
Верес, правильно, что вы убрали сообщение. :)
Лучше сначала сами прочтите эту статью, а еще лучше попробуйте сами. ;)
А qate уже дважды вам открыто написал, как можно (и под вендой в том числе) запустить больше потоков.


Название: Re: сколько потоков следует использовать
Отправлено: qate от Январь 29, 2015, 13:18
Сделайте несколько ниток, например, по одной нитке на 50 - 100 устройств.

а смысл так делать ? на процессоры потоки раскидать ?
если и решу одну очередь, то один поток ее и обработает

но вот не хочу городить очередь - логика становится путаная
в потоке как хорошо - линейный процесс опроса устройства, а в очереди нужно смотреть ответил, нет, повторить - запутаюсь


Название: Re: сколько потоков следует использовать
Отправлено: Bepec от Январь 29, 2015, 13:20
Приведённая мною цифра была выдана как раз тестлимитом года полтора назад на приведённой мной конфигурации.
Сейчас перепроверил - теперь выдаёт около 2к. Что произошло - хз :)


Название: Re: сколько потоков следует использовать
Отправлено: Old от Январь 29, 2015, 13:20
но вот не хочу городить очередь - логика становится путаная
в потоке как хорошо - линейный процесс опроса устройства, а в очереди нужно смотреть ответил, нет, повторить - запутаюсь
Оформите этот линейный процесс опроса как функцию и запускайте ее в потоке. Нет никакой разницы.
Какие очереди вас пугают?


Название: Re: сколько потоков следует использовать
Отправлено: Old от Январь 29, 2015, 13:21
Приведённая мною цифра была выдана как раз тестлимитом года полтора назад на приведённой мной конфигурации.
Сейчас перепроверил - теперь выдаёт около 2к. Что произошло - хз :)
Вы забыли цифры из статьи и все наладилось. :)


Название: Re: сколько потоков следует использовать
Отправлено: qate от Январь 29, 2015, 13:31
Оформите этот линейный процесс опроса как функцию и запускайте ее в потоке. Нет никакой разницы.
Какие очереди вас пугают?

линейный процесс на каждое устройство в функцию и в поток ? так это и будет 100 потоков )

пугает внесение логики в очередь
собственно для тестов я уже написал эту очередь ранее, но там много чего не хватает (повторов, событий, промежуточных состояний опроса)
поэтому я и подумал о потоках как иной вариант для рассмотрения


Название: Re: сколько потоков следует использовать
Отправлено: kuzulis от Январь 29, 2015, 13:33
Может Верес имел ввиду ограничение в 63 (MAXIMUM_WAIT_OBJECTS) хендлов для функций типа WaitForMultipleObjects? :)


Название: Re: сколько потоков следует использовать
Отправлено: Bepec от Январь 29, 2015, 13:41
Я имел в виду что при запуске testLimit -t на i7 он выдал число 63.


Название: Re: сколько потоков следует использовать
Отправлено: qate от Январь 29, 2015, 14:13
еще одна особенность моего случая то, что устройства имеют небольшие отличия в обмене
т.о. в случаи с потоками решается созданием другого класса (наследованием от базового обмена) и запуск его в потоке, а в случаи с очередью придется учесть и это, что усложнит ее


Название: Re: сколько потоков следует использовать
Отправлено: TheAthlete от Январь 29, 2015, 14:16
Думаю можно еще посмотреть в сторону libev: https://github.com/sjinks/qt_eventdispatcher_libev


Название: Re: сколько потоков следует использовать
Отправлено: Old от Январь 29, 2015, 14:21
линейный процесс на каждое устройство в функцию и в поток ? так это и будет 100 потоков )
Почему? :)
Вы запустили 10 рабочих потоков, которые по очереди берут выполняют нужные функции, которые описывают линейный процесс. :)
Рабочий поток освободился - пошел проверять очередное устройство.
Посмотрите на QRunnable + QThreadPool


Название: Re: сколько потоков следует использовать
Отправлено: qate от Январь 29, 2015, 15:25
Думаю можно еще посмотреть в сторону libev: https://github.com/sjinks/qt_eventdispatcher_libev

не знаком, что это и зачем ?


Название: Re: сколько потоков следует использовать
Отправлено: qate от Январь 29, 2015, 15:30
Вы запустили 10 рабочих потоков, которые по очереди берут выполняют нужные функции, которые описывают линейный процесс. :)
Рабочий поток освободился - пошел проверять очередное устройство.
Посмотрите на QRunnable + QThreadPool

нужно запускать например 30 устройств сразу, не дожидаясь пока 10 первых отработают

QRunnable не имеет eventloop - нужны события ("наверх" о процессе запуска в gui) и внутрь (прерывание, сброс принудительно)



Название: Re: сколько потоков следует использовать
Отправлено: Old от Январь 29, 2015, 16:09
нужно запускать например 30 устройств сразу, не дожидаясь пока 10 первых отработают
Ну сделайте 30 рабочих потоков. :)
Вы же понимаете, что реально 100 потоков не выполняются одновременно. Пока свой квант времени отрабатывает один поток (на одном ядре), все остальные ждут.


Название: Re: сколько потоков следует использовать
Отправлено: __Heaven__ от Январь 29, 2015, 16:24
А вы не думали, быть может ваша задача вообще на одном потоке решается? Попробовать сделать замер....
Мне, вообще, видится, что нужно иметь по потоку на ядро и очередь запросов.


Название: Re: сколько потоков следует использовать
Отправлено: qate от Январь 29, 2015, 16:26
Ну сделайте 30 рабочих потоков. :)
Вы же понимаете, что реально 100 потоков не выполняются одновременно. Пока свой квант времени отрабатывает один поток (на одном ядре), все остальные ждут.

так и делаю 500 обычных (в том смысле что пул потоков мне тут не поможет)



Название: Re: сколько потоков следует использовать
Отправлено: Old от Январь 29, 2015, 16:32
так и делаю 500 обычных (в том смысле что пул потоков мне тут не поможет)
Хозяин-барин. :)
Чем больше рабочих потоков - тем больше процессорного времени улетает впустую на переключения контекста. Не говоря уже о бесполезном расходовании адресного пространства на стеки этих потоков.
А выгоды никакой они не приносят. :)


Название: Re: сколько потоков следует использовать
Отправлено: qate от Январь 29, 2015, 16:36
А вы не думали, быть может ваша задача вообще на одном потоке решается? Попробовать сделать замер....
Мне, вообще, видится, что нужно иметь по потоку на ядро и очередь запросов.

решается, конечно, но нужна очередь "умная", а писать ее сложнее чем с потоками
вопрос был именно в живучести данного очень моногопоточного решения

итого я решил пробовать многопоточку, посмотрим как будет жить




Название: Re: сколько потоков следует использовать
Отправлено: qate от Январь 29, 2015, 16:37
А выгоды никакой они не приносят. :)

мне как разработчику - приносят )


Название: Re: сколько потоков следует использовать
Отправлено: Bepec от Январь 29, 2015, 18:43
Я работу 10 потоков разных могу понять только с ручкой и бумажкой, и то приблизительно.
А вы на 100 замахнулись.

PS ну пусть человек порадуется :) Главное чтоб потом выложил результаты своих трудов - хотя б описание ощущений от отладки этой системы :)


Название: Re: сколько потоков следует использовать
Отправлено: qate от Январь 30, 2015, 08:28
Я работу 10 потоков разных могу понять только с ручкой и бумажкой, и то приблизительно.
А вы на 100 замахнулись.

PS ну пусть человек порадуется :) Главное чтоб потом выложил результаты своих трудов - хотя б описание ощущений от отладки этой системы :)

что 2 что 100 - нет разницы, ведь они одинаковы в поведении
отладка также одинакова - лог действий


Название: Re: сколько потоков следует использовать
Отправлено: Bepec от Январь 30, 2015, 09:22
А вы попробуйте, а потом уже скажите :)


Название: Re: сколько потоков следует использовать
Отправлено: Akon от Январь 30, 2015, 13:16
Один рабочий поток (на все ядра) и обмен асинхронный.


Название: Re: сколько потоков следует использовать
Отправлено: lex от Февраль 01, 2015, 00:56
еще одна особенность моего случая то, что устройства имеют небольшие отличия в обмене
т.о. в случаи с потоками решается созданием другого класса (наследованием от базового обмена) и запуск его в потоке, а в случаи с очередью придется учесть и это, что усложнит ее


Как альтернатива:
1. Объявляете сигнал
2. Соединяете с ним слоты объектов-опросчиков (при этом объекты могут быть самых разных классов, даже не родственных)
3. Емитируете сигнал.
4. Опросчики запускаются в том порядке в котором было произведено соединение с сигналом.

Кстати, при наличии нескольких процессоров, вышеописанную схему можно разнести на реально необходимое количество потоков.


Название: Re: сколько потоков следует использовать
Отправлено: Igors от Февраль 01, 2015, 11:57
стоит ли отказаться от такой архитектуры и выдумывать очередь на все устройства, работающею из одного потока ?
А что тут "выдумывать" - очередь давно известна, это примерно 2 десятка строк кода. И на любое число ниток. Или еще проще: слот-сигнал с QueuedConnection. А вот заводить нитку "на каждый чих" - единодушно (и справедливо) осуждается