Совместим ли threading.Lock() с QThread() и QMutex() совместим с потоками Python?

Я использую Python 3.7PyQt5 для 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. Совместимость

Я бы хотел знать:

  1. Является threading.Lock() совместим с темами, созданными с QThread()?

  2. Является QMutex() совместимы с обычными потоками Python?

Другими словами, это большое дело, если эти вещи немного перемешать? - Например: несколько потоков Python запускаются в приложении, рядом с некоторыми QThread, а некоторые вещи защищены threading.Lock(), другие вещи по QMutex(),

1 ответ

Решение

TL;DR; безразлично использовать их в сочетании.


QThreads не являются потоками Qt, то есть они не являются новыми потоками, но это класс, который управляет собственными потоками каждой ОС, и то же самое происходит с потоками Python, которые также являются оболочкой для обработки собственных потоков. И то же самое происходит с QMutex а также threading.Lock() поэтому безразлично использовать один или другой, потому что в фоновом режиме вы используете нативные потоки и мьютекс.

Другие вопросы по тегам