Путевые заметки в процессе познания Python и PyQt/PySide.
Помни - только тег CODE не портит код добавлением пробела в начало пустой строки.
Помни - только тег CODE не портит код добавлением пробела в начало пустой строки.
К вопросу о применении QSqlDatabase в QThread.
Запись от iamvic размещена 04.12.2021 в 14:08
Показов 1079
Комментарии 0
Метки multithreading, pyqt5, python, python 3, qt5, многопоточность
И всё-таки есть смысл в написании мелких "тренажёрчиков", которые в наглядном виде позволяют понять "как же оно там всё внутри устроено, что за что цепляется и как всё получается". По крайней мере, можно позволить себе некоторые вольности в формулировках, исполнении и оформлении (пункт 2 из PEP 8 - наше всё!!! ). Если требуется донести смысл происходящего (не только "что делать" и "как быть", но и "почему именно так" и чем было мотивировано то или иное решение), то в какой форме и какими словами это будет сделано - без разницы. Главное, чтобы результаты были обоснованными.И, вот, ляпнув в одном из комментариев при обсуждении К вопросу о глобальных переменных и инкапсуляции в приложениях PyQt., что QSqlDatabase.addDatabase() вполне годен для применения именно в дополнительных потоках, озаботился я тем, что нет у меня такого рафинированного рукоделия на эту тему. Решение-то известное, простое, давно работает в разных местах, а в "тренажёрчик" не оформилось. А там есть некоторые нюансы, в том числе и эксплуатационные, которые могут крови попортить... Долго ли, коротко ли, но результат народился. Поделка достаточно примитивная - главное окно, меню на три пункта и центральный виджет для протокола. В работе тоже проста как дверь - регистрируемся на SQL-сервере, стартуем дополнительные потоки, в протоколе наблюдаем появление и исчезновение SQL-соединений, используемых дополнительными потоками. Ограничений на количество дополнительных потоков нет (это ж моделька для испытаний, а не реальное изделие). Соединение по умолчанию создаётся при старте приложения, после успешной регистрации выполняется всего один SQL-запрос. Стартовавшие дополнительные потоки, создав свои уникальные соединения, тоже выполняют только один SQL-запрос, а затем погружаются в сон на 10 секунд, после чего завершают свою работу. Заточено всё под PostgreSQL. А теперь слайды: 1. Регистрация на сервере. 2. Что видим в протоколе после запуска дополнительных потоков. Добавлено 28.08.2022: Интересный вывод следует из этой картинки. Оказывается, что список существующих соединений, возвращаемый QSqlDatabase.connectionNames(), не упорядочен по времени создания соединения. Тут ведь первым создавалось соединение по умолчанию (qt_sql_default_connection). Наверное, можно было бы ожидать, что именно оно и будет всегда первым в списке (создаём-то все соединения с помощью QSqlDatabase.addDatabase(), что как бы намекает). Но действительность оказывается совершенно иной. 3. Что видит в это время администратор базы данных. и демонстрация некоторых внутренностей: 1. код подкласса дополнительного потока (модуль thread_kit.py) Кликните здесь для просмотра всего текста
2. код запуска дополнительного потока (вырезка из модуля main_window.py): Кликните здесь для просмотра всего текста
Весь исходный код можно найти в прилагаемом архивчике. Ничего сложного, невозможного - нет. Главное, не лениться... И если там чего не так, то стесняться не надо. С удовольствием приму любые замечания, высказанные в любой форме, вплоть до инвективной лексики (если их пропустят модераторы), с одним условием - они должны иметь обоснование. Если "плохо", то далее следует "почему плохо" с подробным описанием Вашего понимания ситуации. Если даёте ссылочку, то расскажите как Вы понимаете то, что там написано, чтоб я мог сравнить со своим пониманием прочитанного по этой ссылке. Вполне возможно, что я ошибаюсь и ничего в этом зазорного нет - человеку свойственно ошибаться, все мы постоянно учимся на ошибках. PS: однако, реализуя имеющуюся возможность в реальных проектах, не стоит забывать о возможных последствиях. Иначе, небывалая живость администратора базы данных может обернуться неприятным сюрпризом. SQL-шторм никого не оставляет равнодушным... Доработанная версия приложения выложена в записи блога К вопросу о переключениях GUI с одного потока на другой в приложениях PyQt. | ||||||||||
Метки multithreading, pyqt5, python, python 3, qt5, многопоточность
Размещено в Памятка
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии

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

