Python 相当于 java 同步

Python equivalent of java synchronized

在java中,只需添加synchronized关键字就可以使变量线程安全。在python中有什么可以达到相同的结果吗?

您可以使用 with self.lock: 然后将您的代码放在那里。有关详细信息,请参阅 http://theorangeduck.com/page/synchronized-python

使用 with self.lock 的工作代码可以处理 exception 如果发生:

Manager 内部,我们正在使 Manager 方法线程安全:

from threading import RLock


class Manager:
    def __init__(self):
        self.lock = RLock()
        self.hash: dict[str, int] = dict()

    def containsToken(self, key) -> bool:
        with self.lock:
            self.lock.acquire()
            return key in self.hash


    def addToken(self, token: str):
        with self.lock:
            token = token.strip()
            if token in self.hash:
                self.hash[token] = self.hash[token] + 1
            else:
                self.hash[token] = 1


    def removeToken(self, token):
        with self.lock:
            if token not in self.hash:
                raise KeyError(f"token : {token} doesn't exits")
            self.hash[token] = self.hash[token] - 1
            if self.hash[token] == 0:
                self.hash.pop(token)

if __name__ == "__main__":
    sync = Manager()
    sync.addToken("a")
    sync.addToken("a")
    sync.addToken("a")
    sync.addToken("a")
    sync.addToken("B")
    sync.addToken("B")
    sync.addToken("B")
    sync.addToken("B")
    sync.removeToken("a")
    sync.removeToken("a")
    sync.removeToken("a")
    sync.removeToken("B")
    print(sync.hash)

输出:

{'a': 1, 'B': 3}