2015-12-02 3 views
1

В настоящее время я пытаюсь реализовать многопоточный интерфейс подключения к базе данных для личного использования. Это осуществляется с помощью 3-х классовИмеет ли много потоков в приложении счетчик продуктивным?

  • DatabaseManager База данных Connexion instancier инстанцирования нового потока для каждого соединения
  • Database объекта наследования от QThread, предназначенный для запуска в главном потоке и подвергая интерфейс, чтобы сделать вещи объект работника
  • DatabaseWorker объект рабочий, который запускает цикл обработки событий в рабочем потоке управляющий одно соединение с базой данных, ожидает запросов и доставки результатов с помощью Qt: QueuedConnections (сигнал/слотов)
  • Когда соединение больше не используется (явный вызов к методу close()), связанный цикл события останавливается и поток удаляется. Цель состоит в том, чтобы сохранить создание и удаление потоков как минимум.

Эта архитектура имеет большой успех до сих пор с ограниченным количеством потоков (обычно не более 10 соединений). Моя основная проблема заключается в том, что я не знаю, как это будет выглядеть, если у меня есть 100+ соединений, которые означают более 100 потоков для одного приложения, которые приносят мой главный вопрос

Имеет ли много потока в приложении счетчик продуктивным? что произойдет, если я открою соединения 50/100/500/1000 одновременно? если я это сделаю, операции с базой данных ввода-вывода займут много времени (это не было разработано для этого в первую очередь), но сколько из этого отставания вызвано количеством потоков?

+0

Это зависит от оборудования, на котором работает приложение. Если вы действительно можете запускать потоки на разных ядрах, тогда вы получите выигрыш, пока планировщик не задушит каждое отдельное ядро. Это с обычным предостережением о том, что задания потоков действительно независимы. Здесь нет определенного ответа, может рассказать только профилирование. – StoryTeller

+0

Dunno - спросите свою базу данных :) 100 или даже 1000, нити не являются сами по себе, особая проблема. Характеристики вашей БД могут быть ... –

+0

Аппаратное обеспечение Intel I5 2.4GHz с 6 аппаратными потоками и открытие большого количества подключений к базам данных не является проблемой, так как я могу открыть 100 подключений к 100 различным базам данных на разных серверах.На данный момент я беспокоюсь только о своем локальном приложении – Nyashes

ответ

2

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

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

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

Измерьте производительность и отрегулируйте соответствующим образом :) «Чувство« Чувство »очень ненадежно при работе над производительностью.

+1

Я согласен. Некоторые люди ненавидят потоки, но если вы используете пул потоков, вы избегаете слишком большого количества потоков, все еще получая логику приложения, похожую на модель «один поток на соединение». При написании кода сокета мне очень жаль возвращаться с получитаемыми данными в сокете и делать много уродливого бухгалтерского учета. Нити, или в некоторых случаях, сопрограммы, допускают гораздо более чистый код, что также переводит на меньшее количество ошибок. Отладка потоков приложений может быть боль, хотя ... –

0

Я бы сказал, что да, это счетчик продуктивности. Каждый поток использует значительную часть памяти для своего пространства стека, и если у вас есть только 6 ядер, вы не можете одновременно запускать 100 потоков. Вместо этого используйте пул потоков, например. через KF5 ThreadWeaver или Qt Concurrent и обратите внимание на идеальное количество потоков.

+0

Ну, идеальный счетчик потоков подходит для работы с процессором. Доступ к базе данных блокирует операцию ввода-вывода. ровно 6 потоков, мое приложение будет спать 80% времени, ожидающего ответов от сервера. Мне определенно нужно больше, чем – Nyashes

+0

оба Thre adWeaver и Qt Concurrent позволяют настраивать количество потоков в пуле. Используйте профилирование, чтобы найти оптимальное значение для вашего прецедента. Идеальное количество потоков - это безопасная первая ставка, безусловно, лучше, чем оставить ее несвязанной и разворачивать сотни потенциально временных потоков. – milianw