Я использую Python 3.7 (с PyQt5 для графического интерфейса) на компьютере Windows 10 .Мое приложение нуждается в многопоточности.Для этого я использую QThread()
.
. Мне нужно защитить некоторый код мьютексом.Я полагал, что у меня есть следующие два варианта: защитить его с помощью замка из модуля Python threading
или QMutex()
.
1.Защита с помощью threading.Lock ()
Вот как я делаю мьютекс:
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#threading.Lock
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()
.