我在 Windows 10 计算机上使用 Python 3.7 (GUI带有 PyQt5 )。我的应用程序需要一些多线程。为此,我使用QThread()
。
我需要用互斥锁保护一些代码。我认为我有以下两种选择:使用Python threading
模块的锁或QMutex()
保护锁。
这就是我制作互斥锁的方式:
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
制作互斥锁:
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
您可以在QMutex()
上找到Qt5文档:http://doc.qt.io/qt-5/qmutex.html
我想知道:
threading.Lock()
是否与用QThread()
制成的线程兼容?
QMutex()
与普通的Python线程兼容吗?
换句话说,如果这些事情混杂在一起,这有什么大不了的吗? -例如:一些python线程在某个应用程序中运行,在某些QThread旁边,而某些内容受threading.Lock()
保护,其他内容受QMutex()
保护。
答案 0 :(得分:1)
TL; DR; ,将它们组合使用并不重要。
QThread不是 Qt线程,即它们不是新线程,而是对每个操作系统的本机线程进行管理的类,并且 Python线程也是用于处理本机线程的包装器。 ERROR (smart_recruiters) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected
ERROR (smart_recruiters) Authentication failure! invalid_credentials: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected
FATAL
和QMutex
也会发生相同的事情,因此使用一个或另一个无关紧要,因为在后台使用的是本机线程和互斥锁。