Совместим ли threading.Lock() с QThread() и QMutex() совместим с потоками Python?
Я использую Python 3.7 (с PyQt5 для GUI) на компьютере с Windows 10. Мое приложение нуждается в многопоточности. Для этого я использую QThread()
,
Мне нужно защитить некоторый код с помощью мьютекса. Я подумал, что у меня есть следующие два варианта: защитить его с помощью блокировки от Python threading
модуль или с QMutex()
,
1. Защита с помощью потоков. Блокировка ()
Вот как я делаю свой мьютекс:
import threading
...
self.mutex = threading.Lock()
и как я это использую:
def protected_function(self):
if not self.mutex.acquire(blocking=False):
print("Could not acquire mutex")
return
# Do very important
# stuff here...
self.mutex.release()
return
Вы можете найти документы по Python здесь: https://docs.python.org/3/library/threading.html
2. Защита с помощью QMutex()
Чтобы сделать мьютекс:
from PyQt5.QtCore import *
...
self.mutex = QMutex()
и как его использовать:
def protected_function(self):
if not self.mutex.tryLock():
print("Could not acquire mutex")
return
# Do very important
# stuff here...
self.mutex.unlock()
return
Вы можете найти документы Qt5 на QMutex()
здесь: http://doc.qt.io/qt-5/qmutex.html
3. Совместимость
Я бы хотел знать:
Является
threading.Lock()
совместим с темами, созданными сQThread()
?Является
QMutex()
совместимы с обычными потоками Python?
Другими словами, это большое дело, если эти вещи немного перемешать? - Например: несколько потоков Python запускаются в приложении, рядом с некоторыми QThread, а некоторые вещи защищены threading.Lock()
, другие вещи по QMutex()
,
1 ответ
TL;DR; безразлично использовать их в сочетании.
QThreads не являются потоками Qt, то есть они не являются новыми потоками, но это класс, который управляет собственными потоками каждой ОС, и то же самое происходит с потоками Python, которые также являются оболочкой для обработки собственных потоков. И то же самое происходит с QMutex
а также threading.Lock()
поэтому безразлично использовать один или другой, потому что в фоновом режиме вы используете нативные потоки и мьютекс.