日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Python 中@lazyprop 裝飾器的用法

瀏覽:29日期:2022-06-18 13:51:52
安裝

pip install lazyprop例子1

from lazyprop import lazypropclass Foo(object): def __init__(self):self.load_count = 0 @lazyprop def lazy(self):self.load_count += 1f = Foo()f.lazyf.lazyf.lazyprint(f.load_count)

輸出:

1

例子2

from lazyprop import lazypropclass Foo(object): def __init__(self):self.load_count = 0 # @lazyprop def lazy(self):self.load_count += 1f = Foo()f.lazyf.lazyf.lazyprint(f.load_count)

輸出:

0

補充:python語言中的AOP利器:裝飾器

一、前言

面向切面編程(AOP)是一種編程思想,與OOP并不矛盾,只是它們的關注點相同。面向對象的目的在于抽象和管理,而面向切面的目的在于解耦和復用。

舉兩個大家都接觸過的AOP的例子:

1)java中mybatis的@Transactional注解,大家知道被這個注解注釋的函數立即就能獲得DB的事務能力。

2)python中的with threading.Lock(),大家知道,被這個with代碼塊包裹的部分立即獲得同步的鎖機制。

這樣我們把事務和加鎖這兩種與業務無關的邏輯抽象出來,在邏輯上解耦,并且可以輕松的做到代碼復用。

二、上下文管理器contextlib

當然你可以使用with上下文管理器實現一些AOP的思想,這里有個模塊叫contextlib可以幫助你簡易的實現上下文管理器。

上下文管理最常見的例子是with open(’file’) as fh,回收打開句柄的例子。

這種方式還是比較麻煩的,下面我們看一下python中的裝飾器怎么樣實現AOP編程。

三、裝飾器:AOP的語法糖

python中的裝飾器就是設計來實現切面注入功能的。下面給出幾個例子,這幾個例子都是在生產環境驗證過的。

其中的任務管理機是偽代碼,需要自己實現寫數據庫的邏輯。

1、重試邏輯

只要do函數被@retry_exp裝飾,便可以獲得指數退避的重試能力。

@retry_exp(max_retries=10)def do(): # do whatever pass

那retry_exp是如何實現的呢?

def retry_exp(max_retries=3, max_wait_interval=10, period=1, rand=False): def _retry(func):def __retry(*args, **kwargs): MAX_RETRIES = max_retries MAX_WAIT_INTERVAL = max_wait_interval PERIOD = period RAND = rand retries = 0 error = None ok = False while retries < MAX_RETRIES:try: ret = func(*args, **kwargs) ok = True return retexcept Exception, ex: error = exfinally: if not ok:sleep_time = min(2 ** retries * PERIOD if not RAND else randint(0, 2 ** retries) * PERIOD, MAX_WAIT_INTERVAL)time.sleep(sleep_time)retries += 1 if retries == MAX_RETRIES:if error: raise errorelse: raise Exception('unknown')return __retry return _retry2、降級開關

只要do函數被@degrade裝飾,就會安裝app名稱校驗redis里的開關,一旦發現開關關閉,則do函數不被執行,也就是降級。

@degradedef do(app): # do whatever pass

那么degrade是怎樣實現的呢?

def degrade(app): def _wrapper(function):def __wrapper(*args, **kwargs): value = None try:redis = codis_pool.get_connection()value = redis.get('dmonitor:degrade:%s' % app) except Exception, _:logger.info(traceback.format_exc()) if not value or int(value) != 1:function()logger.info('[degrade] is_on: %s' % app) else:logger.info('[degrade] is_off: %s' % app)return __wrapper return _wrapper3、任務狀態機

這個是最常用的,我們需要跟蹤落盤DB一個任務的執行狀態(等待調度,執行中,執行成功,執行失敗)

一旦do方法被@tasks_decorator裝飾,就獲得了這樣的能力。對item_param(是個json)中task_id指明的任務進行狀態管理。

@tasks_decoratordef do(item_param): # do whatever pass

tasks_decorator是怎樣實現的呢?

def tasks_decorator(function): def _wrap(*args, **kwargs):param_dict = kwargs.get(’item_param’)task_id = param_dict.get(’task_id’)try: param_dict.update({’status’: TaskStatus.Waiting, ’start_time’: datetime.now().strftime(’%Y-%m-%d %H:%M:%S’)}) try:manager_dao.save_task(param_dict) except Exception, ex:pass _update_task_status(task_id, TaskStatus.Doing) function(*args, **kwargs) _update_task_status(task_id, TaskStatus.Done)except Exception as e: time.sleep(0.5) _update_task_status(task_id, TaskStatus.Fail, unicode(e.message)) raise return _wrap4、全局唯一性

在分布式+異步環境中,如果想保證exactly once是需要額外的邏輯的,其實主要是實現唯一鍵,一旦唯一鍵實現了,就可以使用公共緩存redis進行唯一鍵判定了。

do函數被unique裝飾,那么對于task_id對應的任務,全局只會執行一次。

@uniquedef do(task_id): # do whatever pass

unique是怎樣實現的呢?

def unique(function): def _wrap(*args, **kwargs):task_id = kwargs.get(’task_id’)try: redis = codis_pool.get_connection() key = 'unique:%s' % task_id if not redis.setnx(key):redis.expire(key, 24*60*60)function(*args, **kwargs)except Exception as e: logger.error(traceback.format_exc()) raise return _wrap四、總結

AOP在少量增加代碼復雜度的前提下,顯著的獲得以下優點:

1、使得功能邏輯和業務邏輯解耦,功能和業務的修改完全獨立,代碼結構清晰,開發方便

2、一鍵注入,代碼復用程度高,擴展方便

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩一区二区中文| 97精品国产一区二区三区| 蜜桃国内精品久久久久软件9| 国产精品18| 欧美黄色一区| 精品中文在线| 黑人精品一区| 国产高清不卡| 欧美成人高清| 免费人成黄页网站在线一区二区| 免费在线视频一区| 91精品国产经典在线观看| 欧美国产不卡| 成人自拍av| 好看的av在线不卡观看| 欧美不卡视频| 亚洲69av| 久久精品亚洲一区二区| 亚洲四虎影院| 视频一区视频二区在线观看| 日韩欧美精品一区二区综合视频| 欧美国产日韩电影| 欧美日韩一二| 日本成人中文字幕| 国内精品美女在线观看| 欧美日韩国产高清电影| 日韩精品视频网| 成年男女免费视频网站不卡| 蘑菇福利视频一区播放| 久久久免费人体| 亚洲五月婷婷| 欧美影院视频| 不卡视频在线| 国产精品久一| 日韩久久99| 中文字幕在线看片| 亚洲精品乱码| 亚洲天堂一区二区| 欧美欧美黄在线二区| 神马午夜久久| 日本va欧美va瓶| 日本不卡免费高清视频在线| 亚洲尤物av| 日韩高清欧美| 日韩av不卡一区二区| 日韩成人精品一区二区| 亚洲精品激情| 在线视频观看日韩| 国产欧美日韩在线一区二区| 黑丝一区二区| 日韩欧美不卡| 国产精品久久久久久久久免费高清| 久久国产电影| 欧美aaaaaa午夜精品| 蜜臀久久久久久久| 丝袜美腿诱惑一区二区三区 | 亚洲一区久久| 久久99久久久精品欧美| 91久久中文| yellow在线观看网址| 欧美偷窥清纯综合图区| 午夜av一区| 成人日韩av| 国产图片一区| 另类国产ts人妖高潮视频| 三级精品视频| 久久久亚洲欧洲日产| 日本不卡的三区四区五区| 欧美99久久| 欧美激情另类| 国产精品高清一区二区| 亚洲精品第一| 蜜臀av一区二区在线免费观看| 久久男人av资源站| 国产精品chinese| 欧美在线不卡| 日韩三级一区| 亚洲精品成人一区| 综合国产精品| 蜜臀av亚洲一区中文字幕| 欧美亚洲激情| 色综合www| 精品日本视频| 麻豆成人91精品二区三区| 久久国产精品色av免费看| 日韩一区二区三区免费视频| 视频一区欧美精品| 麻豆91精品| 日韩午夜黄色| 日韩视频不卡| 制服诱惑一区二区| 99视频在线精品国自产拍免费观看| 久久蜜桃av| 人人精品亚洲| 欧美一级精品| 免费黄色成人| 99视频在线精品国自产拍免费观看| 欧美成人高清| 激情五月色综合国产精品| 久久久久久久久久久妇女| 亚洲1234区| 不卡在线一区| 亚洲一区日韩在线| 日本大胆欧美人术艺术动态| 亚洲久草在线| 国产调教精品| 国产精品成人a在线观看| 日韩在线二区| 欧美精品激情| 亚洲精品日韩久久| 国产人成精品一区二区三| 欧美a在线观看| 中文字幕在线看片| 久久久久蜜桃| 日韩一区精品字幕| 日韩和欧美的一区| 国产精品99久久久久久董美香| 欧美黄色精品| 91嫩草亚洲精品| 久久中文视频| 亚洲三级毛片| 国产精品红桃| 欧美日韩亚洲在线观看| 日韩一区欧美二区| 青青草伊人久久| 福利在线一区| 国产视频亚洲| 国产精品入口久久| 久久精品免费一区二区三区 | 日本欧美不卡| 99re国产精品| 久久国内精品| 久久九九精品| 日韩欧美中文字幕电影| 精品一区二区三区中文字幕视频| 亚洲国产欧美日本视频| 午夜在线播放视频欧美| 久久成人福利| 91精品99| 国产福利资源一区| 伊人久久亚洲美女图片| 你懂的国产精品永久在线| 婷婷亚洲五月色综合| 亚洲91网站| 一本大道色婷婷在线| 日本大胆欧美人术艺术动态| 精品视频在线你懂得| 91久久国产| 麻豆精品新av中文字幕| 最新日韩欧美| 精品中文字幕一区二区三区| 久久av一区| 日本在线高清| 91精品啪在线观看国产爱臀| 久久久久久久久99精品大| 欧美日韩一区二区三区不卡视频 | 欧美91视频| 国产精品久久乐| 国产精品毛片在线看| 国产精品久久久久蜜臀| 亚洲精品影视| 91精品国产乱码久久久久久久 | 嫩呦国产一区二区三区av| 欧美.日韩.国产.一区.二区 | 日韩精品网站| 国产精品主播| 黄色免费成人| 国产一区二区三区精品在线观看| 蜜臀91精品一区二区三区| 日韩一区电影| 开心激情综合| 日韩综合小视频| 蜜臀国产一区| 国产亚洲电影| 亚洲影院天堂中文av色| 久久五月天小说| 成人台湾亚洲精品一区二区| 日韩成人一级| 久久午夜视频| 激情久久中文字幕| 中文字幕人成乱码在线观看| 国产精品激情| 日韩高清三区| 亚洲一区二区三区免费在线观看| 电影亚洲精品噜噜在线观看| 精品亚洲二区| 国产日韩中文在线中文字幕 | 麻豆精品视频在线观看| 日韩在线成人| 视频一区二区三区在线| 在线观看免费一区二区| 久久久天天操| 国产欧洲在线| 国产专区精品| 精品一区二区三区亚洲| 国产麻豆精品| 国产精品一国产精品k频道56| 亚洲狼人精品一区二区三区| 尤物精品在线| 午夜av一区|