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}
在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}