Python使用functools實(shí)現(xiàn)注解同步方法
在 Python 中沒(méi)有類似 Java 中使用的 synchronized 關(guān)鍵字來(lái)同步方法,因此在 Python 中要實(shí)現(xiàn)同步方法,通常我們是使用 threading.Lock() 來(lái)實(shí)現(xiàn)。在進(jìn)入函數(shù)的地方獲取鎖,出函數(shù)的時(shí)候釋放鎖,這樣實(shí)現(xiàn)代碼看起好非常不好看。另外網(wǎng)上也有人給出了其它幾種實(shí)現(xiàn)方式,但看起來(lái)都不美氣。
今天我在做項(xiàng)目的時(shí)候突然想到是不是可以通過(guò) functools 來(lái)實(shí)現(xiàn)通過(guò)注解來(lái)標(biāo)注方法為同步方法。
首先要求自己的類中有一個(gè)鎖對(duì)象并且在類初始化的時(shí)候初始化這個(gè)鎖對(duì)象,比如:
class MyWorker(object):
def __init__(self):
self.lock = threading.Lock()
...
...
然后創(chuàng)建一個(gè) synchronized 函數(shù),這個(gè)函數(shù)裝飾具體對(duì)象的具體方法,將方法放到獲取/釋放鎖之間來(lái)運(yùn)行,如下
def synchronized(func):
@functools.wraps(func)
def wrapper(self, *args, **kwargs):
with self.lock:
return func(self, *args, **kwargs)
return wrapper
最后在需要使用同步的方法上使用 @synchronized 來(lái)標(biāo)準(zhǔn)方法是同步方法,比如:
@synchronized def test(self): ...
下面是一個(gè)完整例子,僅供參考:
import threading
import functools
import time
def synchronized(func):
@functools.wraps(func)
def wrapper(self, *args, **kwargs):
with self.lock:
return func(self, *args, **kwargs)
return wrapper
class 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實(shí)現(xiàn)注解同步方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Python functools模塊學(xué)習(xí)總結(jié)
- Python中functools模塊的常用函數(shù)解析
- Python中functools模塊函數(shù)解析
- Python3標(biāo)準(zhǔn)庫(kù)之functools管理函數(shù)的工具詳解
- Python編程functools模塊創(chuàng)建修改的高階函數(shù)解析
- Python的functools模塊使用及說(shuō)明
- Python庫(kù)functools示例詳解
- Python中的functools partial詳解
- python高階函數(shù)functools模塊的具體使用
- Python中Functools模塊的高級(jí)操作詳解
- Python函數(shù)式編程模塊functools的使用與實(shí)踐
相關(guān)文章
Python實(shí)現(xiàn)爬取并分析電商評(píng)論
這篇文章主要介紹了Python實(shí)現(xiàn)爬取并分析電商評(píng)論,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Python實(shí)現(xiàn)多組數(shù)據(jù)三維繪圖系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)多組數(shù)據(jù)三維繪圖系統(tǒng),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下2023-08-08
Python中的map()函數(shù)和reduce()函數(shù)的用法
這篇文章主要介紹了Python中的map()函數(shù)和reduce()函數(shù)的用法,代碼基于Python2.x版本,需要的朋友可以參考下2015-04-04
Python內(nèi)建模塊struct實(shí)例詳解
這篇文章主要介紹了Python內(nèi)建模塊struct實(shí)例詳解,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
淺談Python Opencv中g(shù)amma變換的使用詳解
下面小編就為大家分享一篇淺談Python Opencv中g(shù)amma變換的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
Python Pickle 實(shí)現(xiàn)在同一個(gè)文件中序列化多個(gè)對(duì)象
今天小編就為大家分享一篇Python Pickle 實(shí)現(xiàn)在同一個(gè)文件中序列化多個(gè)對(duì)象,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
python不支持i++運(yùn)算原理實(shí)例解析
這篇文章主要為大家介紹了python不支持 i++運(yùn)算原理實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-02-02
python實(shí)戰(zhàn)之PyQt5實(shí)現(xiàn)漫畫臉
本文詳細(xì)講解了python實(shí)戰(zhàn)之PyQt5實(shí)現(xiàn)漫畫臉的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12
瀏覽器常用基本操作之python3+selenium4自動(dòng)化測(cè)試(基礎(chǔ)篇3)
瀏覽器常用基本操作有很多種,今天給大家介紹python3+selenium4自動(dòng)化測(cè)試的操作方法,是最最基礎(chǔ)的一篇,對(duì)python3 selenium4自動(dòng)化測(cè)試相關(guān)知識(shí)感興趣的朋友一起看看吧2021-05-05
基于Python 中函數(shù)的 收集參數(shù) 機(jī)制
今天小編就為大家分享一篇基于Python 中函數(shù)的 收集參數(shù) 機(jī)制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12

