Совместим ли threading.Lock () с QThread () и QMutex () совместим с потоками Python? - PullRequest
0 голосов
/ 23 декабря 2018

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

Хотелось бы узнать:

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

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

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

1 Ответ

0 голосов
/ 23 декабря 2018

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


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

...