国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python使用functools實現(xiàn)注解同步方法

2020-02-22 23:07:57
字體:
供稿:網(wǎng)友

在 Python 中沒有類似 Java 中使用的 synchronized 關(guān)鍵字來同步方法,因此在 Python 中要實現(xiàn)同步方法,通常我們是使用 threading.Lock() 來實現(xiàn)。在進(jìn)入函數(shù)的地方獲取鎖,出函數(shù)的時候釋放鎖,這樣實現(xiàn)代碼看起好非常不好看。另外網(wǎng)上也有人給出了其它幾種實現(xiàn)方式,但看起來都不美氣。

今天我在做項目的時候突然想到是不是可以通過 functools 來實現(xiàn)通過注解來標(biāo)注方法為同步方法。

首先要求自己的類中有一個鎖對象并且在類初始化的時候初始化這個鎖對象,比如:

class MyWorker(object):  def __init__(self):    self.lock = threading.Lock()    ...  ...

然后創(chuàng)建一個 synchronized 函數(shù),這個函數(shù)裝飾具體對象的具體方法,將方法放到獲取/釋放鎖之間來運行,如下

def synchronized(func):  @functools.wraps(func)  def wrapper(self, *args, **kwargs):    with self.lock:      return func(self, *args, **kwargs)  return wrapper

最后在需要使用同步的方法上使用 @synchronized 來標(biāo)準(zhǔn)方法是同步方法,比如:

@synchronizeddef test(self):  ...

下面是一個完整例子,僅供參考:

import threadingimport functoolsimport timedef synchronized(func):  @functools.wraps(func)  def wrapper(self, *args, **kwargs):    with self.lock:      return func(self, *args, **kwargs)  return wrapperclass MyWorker(object):  def __init__(self):    self.lock = threading.Lock()    self.idx = 0  @synchronized  def test1(self):    for i in range(1, 11):      self.idx = self.idx + 1      print "Test1: " + str(self.idx)      time.sleep(1)  @synchronized  def test2(self):    for i in range(1, 11):      self.idx = self.idx + 1      print "Test2: " + str(self.idx)      time.sleep(1)  @synchronized  def test3(self):    for i in range(1, 11):      self.idx = self.idx + 1      print "Test3: " + str(self.idx)      time.sleep(1)worker = MyWorker()threading.Thread(target=worker.test1).start()threading.Thread(target=worker.test2).start()threading.Thread(target=worker.test3).start()

總結(jié)

以上所述是小編給大家介紹的Python使用functools實現(xiàn)注解同步方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對武林站長站網(wǎng)站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 天峨县| 和林格尔县| 荆州市| 临邑县| 新民市| 枣阳市| 许昌市| 新平| 包头市| 凌云县| 应用必备| 当雄县| 漳州市| 诸暨市| 仪陇县| 杂多县| 大兴区| 乌拉特后旗| 西和县| 马尔康县| 峨山| 孝感市| 富平县| 灵宝市| 罗平县| 抚顺县| 松溪县| 日照市| 牙克石市| 渭源县| 墨江| 乐平市| 大渡口区| 平乐县| 凯里市| 右玉县| 金坛市| 荃湾区| 寻乌县| 义乌市| 朝阳县|