2

我正在与测量设备交谈。我基本上发送命令并接收答案。但我提供了一种ask发送命令并读回答案的方法。如果我锁定这个方法,我会因为调用的方法readwrite锁定而陷入死锁。如果我不锁定另一个线程可能会在我阅读之前窃取答案或写入。你将如何实现这一点?

import threading

class Device(object):
    lock = threading.Lock()
    def ask(self, value):
        # can't use lock here would block
        self.write(value) # another thread could start reading the answer
        return self.read()

    def read(self):
        with self.lock:
            # read values from device

    def write(self, value):
        with self.lock:
            # send command to device
4

2 回答 2

3

用于threading.RLock()避免单个线程内的争用:

可重入锁是一种同步原语,可以由同一线程多次获取。在内部,除了原始锁使用的锁定/解锁状态外,它还使用“拥有线程”和“递归级别”的概念。在锁定状态下,某个线程拥有锁;在解锁状态下,没有线程拥有它。

于 2012-11-23T16:02:57.590 回答
1

您可以使用 threading.RLock() 对象来做可重入锁。但是这样重写代码更好,它不需要RLock。例如,您可以以类似的方式从 write()、read() 和 rewrite ask() 中删除锁

    with self.lock:
        self.write(value)
        r = self.read()
    return r

旧版本的 python 中的 RLock() 工作速度较慢,因为它的实现更复杂。

另请注意,在您编写的代码中,您会为所有实例获得一个锁。在某些情况下它是合适的(例如,如果您只有一个设备和许多实例),但通常不是。如果您想为不同的实例使用不同的锁,请将其初始化放在 __init__() 方法中。

于 2012-11-23T16:30:10.730 回答