自定义锁线程 python

Posted

技术标签:

【中文标题】自定义锁线程 python【英文标题】:Custom Locks Threading python 【发布时间】:2015-06-12 00:47:49 【问题描述】:

您好,我正在使用 PyQt4,我需要在 QThread 中实现锁,但此类没有像库线程那样实现的方法锁。 知道如何在这里实现锁吗?

我有一个问题,如果我使用线程我这样实现锁

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()

谢谢

【问题讨论】:

在类属性中存储锁是一件非常奇怪的事情。这意味着Example 的所有实例都将共享同一个锁(但它们不会与任何其他类共享)。虽然可能有您想要这样做的原因,但它们并不常见。你确定不想要self.lock 【参考方案1】:

你想要QMutex 类。 Qt 使用 QtCore.QMutex.lock() 和 unlock() 函数来锁定和解锁 QThreads。

这是一个例子: https://github.com/Werkov/PyQt4/blob/master/examples/threads/waitconditions.py

编辑:尽管存在细微差别,但它们非常相似。

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 行为。这两个都应该彻底解释它们的用途,标准实现中的限制。

标准 Qt 的 QMutex 参考(因此它是用 C++ 编写的),但原理相同。

编辑2:

添加使用标准线程模块和 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.acquire() 和 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

【讨论】:

当然,如果我回答了您的所有问题,并且这适用于您的情况,请随时将其标记为已接受。 怎么样?射击。如果可以,我会将其编辑到我的答案中。 显示一个使用条件和互斥锁的例子可能有点过于复杂(特别是因为 Python 条件有它自己的互斥锁,而 Qt 条件需要你从外部提供一个);肯定有一个只使用互斥锁的例子吗?

以上是关于自定义锁线程 python的主要内容,如果未能解决你的问题,请参考以下文章

python37 1.GIL--全局解释器锁 2.GIL带来的问题 3.为什么需要GIL 4.GIL的加锁解锁时机 5.关于GIL的性能的讨论 6.线程常用方法 7.GIL锁与自定义锁的区别 8.进

python高级之多线程

python多线程详解

python多线程详解

Python并发编程—自定义线程类

python自定义线程池