2

我在Windows 10计算机上使用Python 3.7(带有用于 GUI的PyQt5 )。我的应用程序需要一些多线程。为此,我使用.QThread()

我需要用互斥锁保护一些代码。我想我有以下两个选择:使用 Pythonthreading模块的锁或使用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()

4

1 回答 1

1

TL;博士; 将它们结合使用是无所谓的。


QThreads 不是Qt Threads,也就是说它们不是新线程,但它是一个管理每个操作系统的本机线程的类, Python 线程也是如此,它也是处理本机线程的包装器。同样的事情也发生在 the 上QMutexthreading.Lock()因此使用其中一个或另一个无关紧要,因为在后台您使用的是本机线程和互斥锁。

于 2018-12-23T17:18:17.357 回答