2015-06-12 5 views
1

Привет Я использую PyQt4, и мне нужно реализовать блокировки в QThread, но этот класс не имеет блокировки метода, реализованной подобно потоку библиотеки. Любая идея, как я могу реализовать блокировку здесь?Пользовательские блокировки Threading python

У меня есть вопрос, если я использую резьб я реализовать блокировку как этот

class Example: 
    lock = threading.Lock() 
    def __init__(self) 
     pass 
    def run(self): 
     Example.lock.acquire() 
     ....... 
     ........ 
     Example.lock.realease() 

это то же самое ?:

class Example(QtCore.QThread): 
    mutex = QtCore.QMutex()) 
    def __init__(self) 
     pass 
    def run(self): 
     mutex.lock() 
     ....... 
     ........ 
     mutex.unlock() 

Благодаря

+0

Хранение замка в классе attribu Это очень странная вещь. Это означает, что все экземпляры 'Example' будут использовать одну и ту же блокировку (но они не будут передавать ее другим классам). Хотя могут быть причины, по которым вы хотите это сделать, они не совсем обычны. Вы уверены, что не хотите 'self.lock'? – abarnert

ответ

3

Вы хотите QMutex класс. Qt использует функции QtCore.QMutex.lock() и unlock() для блокировки и разблокировки QThreads.

Вот пример: https://github.com/Werkov/PyQt4/blob/master/examples/threads/waitconditions.py

EDIT: Они достаточно похожи, хотя есть тонкие различия.

http://www.laurentluce.com/posts/python-threads-synchronization-locks-rlocks-semaphores-conditions-events-and-queues/

http://doc.qt.io/qt-4.8/qmutex.html

Класс QMutex эффективным может поддерживать как threading.Lock и threading.RLock поведение. Оба они должны полностью объяснить их использование, ограничения в стандартных реализациях.

Ссылка QMutex для стандартного Qt (поэтому она написана на C++), но те же принципы сохраняются.

EDIT2:

Добавление в качестве примера для обоих, используя стандартный модуль поточной и класс QMutex:

from PySide import QtCore 

mutex = QtCore.QMutex() 

class QtLock(QtCore.QThread): 

    def __init__(self, name): 
     super(QtLock, self).__init__() 
     self.name = name 

    def run(self): 

     for i in range(10): 
      mutex.lock() 
      print i, self.name, 
      mutex.unlock() 

threads = [] 
for i in range(5): 
    name = chr(i + ord('a')) 
    threads.append(QtLock(name)) 

for thread in threads: 
    thread.start() 

for thread in threads: 
    thread.wait() 

Когда я запускаю пример QMutex, я получаю следующее:

0 a 0 d 1 a 0 b 2 a 1 b 2 b 1 d 3 a 3 b 0 c 4 a 4 b 1 c 2 d 2 c 3 d 4 d 5 b 3 c 6 b 5 d 4 c 6 d 7 b 7 d 8 d 5 c 8 b 9 d 6 c 9 b 7 c 8 c 9 c 0 e 1 e 2 e 5 a 3 e 6 a 4 e 7 a 5 e 6 e 8 a 7 e 9 a 8 e 9 e 

Когда я комментирую строки .lock() и .unlock(), я получаю это, показывая, как QMutex эффективно получает и освобождает блокировку:

00 cd 1 d 2 0 e 1 e 21d ec 33 e 4 e 5 00 bd2 a 1 ec a4 d3 6 c 2154 d b a c 3 6 d 2e75 db 8 7a3 e 8 ce 9 b4 4ed b6 c 7 a 55 9b c d a8 c 6 9 6 b 7 b 8 b 9 c ba 7 a 8 a 9 a 

Между тем, здесь у меня почти точно такой же код для стандартного модуля резьб:

import threading 

lock = threading.Lock() 

class PyThread(threading.Thread): 

    def __init__(self, name): 
     super(PyThread, self).__init__() 
     self.name = name 

    def run(self): 

     for i in range(10): 
      lock.acquire() 
      print i, self.name, 
      lock.release() 

threads = [] 
for i in range(5): 
    name = chr(i + ord('a')) 
    threads.append(PyThread(name)) 

for thread in threads: 
    thread.start() 

for thread in threads: 
    thread.join() 

И выход:

0 a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 a 0 b 1 b 2 b 3 b 4 b 5 b 0 c 1 c 6 b 7 b 8 b 9 b 2 c 3 c 4 c 5 c 6 c 0 d 7 c 8 c 0 e 1 e 9 c 1 d 2 e 2 d 3 d 4 d 5 d 6 d 7 d 8 d 9 d 3 e 4 e 5 e 6 e 7 e 8 e 9 e 

Точно так же, когда я закомментируйте замок. приобретать() и lock.release(), я получаю:

0 a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 a 0 b 1 b 2 b 3 b 4 b 5 b 6 b 7 b 8 b 9 b 0 c 1 0 dc 2 c 3 c 4 c 5 1 d 2c 0 e 16 ed c 72 c e8 3 ec 3 d4 e4 9 5cd 5e d 6 6e d 7 d 87 e 8 ed 9 e 9 d 
+0

спасибо! Очень полезно –

+0

Конечно, если бы я ответил на все ваши вопросы, и это работает для вашего дела, не стесняйтесь отмечать его как принятое. –

+0

А что? Стрелять. Я отредактирую это в свой ответ, если смогу. –