PyQt5 : являются ли pyqtSignals потокобезопасными?

#python-3.x #pyqt5 #signals-slots

Вопрос:

Я учусь использовать PyQt5, и есть довольно много моментов, которые ускользают от меня.

Я начал реализовывать QThreads, чтобы заменить потоки, которые я использовал в своем пользовательском интерфейсе, поскольку я понял, что смешивание потоков и QThreads может привести к проблемам позже, и одновременно начал использовать pyqtSignal

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

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

Я не уверен, является ли это хорошей реализацией или нет.

Вот мои вопросы :

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

Комментарии:

1. Можете ли вы уточнить, что вы подразумеваете под «одним из pyqtSignals, который я использую, совместно используется несколькими QThreads»? Вы имеете в виду, что используете несколько экземпляров подкласса QThread, у которого есть пользовательский сигнал?

2. отредактировал мой вопрос для ясности. В настоящее время у меня нет QThreads, но обычные потоки ( еще не закончили реализацию QThreads ). То, как я реализую эту вещь, у меня были бы QThreads, которые используют тот же pyqtSignal, который реализован в основном потоке, а затем предоставлен для использования QThreads. Не пошел дальше, так как понял, что это может быть не очень хорошей идеей ( я не видел, чтобы pyqtSignals реализовывались таким образом), но изо всех сил пытаюсь понять, что делать / не делать.

3. С точки зрения ООП (особенно инкапсуляции), вы должны излучать сигнал от объекта, который «концептуально» сигнализирует. Таким образом, вы не должны излучать сигнал другого объекта, а создавать пользовательские сигналы в подклассе QThread и излучать оттуда. В попытке испустить сигнал из другого источника практически нет никакой пользы.

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

Ответ №1:

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

Поскольку сигналы потокобезопасны, Qt рекомендует передавать объекты QObject, которые находятся в разных потоках.