threading.Lock()是否与QThread()兼容,并且QMutex()与python线程兼容?

时间:2018-12-23 17:04:42

标签: python python-3.x multithreading pyqt5 qmutex

我在 Windows 10 计算机上使用 Python 3.7 (GUI带有 PyQt5 )。我的应用程序需要一些多线程。为此,我使用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

您可以在QMutex()上找到Qt5文档:http://doc.qt.io/qt-5/qmutex.html


3。兼容性

我想知道:

  1. threading.Lock()是否与用QThread()制成的线程兼容?

  2. QMutex()与普通的Python线程兼容吗?

换句话说,如果这些事情混杂在一起,这有什么大不了的吗? -例如:一些python线程在某个应用程序中运行,在某些QThread旁边,而某些内容受threading.Lock()保护,其他内容受QMutex()保护。

1 个答案:

答案 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也会发生相同的事情,因此使用一个或另一个无关紧要,因为在后台使用的是本机线程和互斥锁。