成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Python 中@lazyprop 裝飾器的用法

瀏覽:97日期: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

補(bǔ)充:python語(yǔ)言中的AOP利器:裝飾器

一、前言

面向切面編程(AOP)是一種編程思想,與OOP并不矛盾,只是它們的關(guān)注點(diǎn)相同。面向?qū)ο蟮哪康脑谟诔橄蠛凸芾恚嫦蚯忻娴哪康脑谟诮怦詈蛷?fù)用。

舉兩個(gè)大家都接觸過(guò)的AOP的例子:

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

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

這樣我們把事務(wù)和加鎖這兩種與業(yè)務(wù)無(wú)關(guān)的邏輯抽象出來(lái),在邏輯上解耦,并且可以輕松的做到代碼復(fù)用。

二、上下文管理器contextlib

當(dāng)然你可以使用with上下文管理器實(shí)現(xiàn)一些AOP的思想,這里有個(gè)模塊叫contextlib可以幫助你簡(jiǎn)易的實(shí)現(xiàn)上下文管理器。

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

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

三、裝飾器:AOP的語(yǔ)法糖

python中的裝飾器就是設(shè)計(jì)來(lái)實(shí)現(xiàn)切面注入功能的。下面給出幾個(gè)例子,這幾個(gè)例子都是在生產(chǎn)環(huán)境驗(yàn)證過(guò)的。

其中的任務(wù)管理機(jī)是偽代碼,需要自己實(shí)現(xiàn)寫數(shù)據(jù)庫(kù)的邏輯。

1、重試邏輯

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

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

那retry_exp是如何實(shí)現(xiàn)的呢?

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、降級(jí)開(kāi)關(guān)

只要do函數(shù)被@degrade裝飾,就會(huì)安裝app名稱校驗(yàn)redis里的開(kāi)關(guān),一旦發(fā)現(xiàn)開(kāi)關(guān)關(guān)閉,則do函數(shù)不被執(zhí)行,也就是降級(jí)。

@degradedef do(app): # do whatever pass

那么degrade是怎樣實(shí)現(xiàn)的呢?

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、任務(wù)狀態(tài)機(jī)

這個(gè)是最常用的,我們需要跟蹤落盤DB一個(gè)任務(wù)的執(zhí)行狀態(tài)(等待調(diào)度,執(zhí)行中,執(zhí)行成功,執(zhí)行失敗)

一旦do方法被@tasks_decorator裝飾,就獲得了這樣的能力。對(duì)item_param(是個(gè)json)中task_id指明的任務(wù)進(jìn)行狀態(tài)管理。

@tasks_decoratordef do(item_param): # do whatever pass

tasks_decorator是怎樣實(shí)現(xiàn)的呢?

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、全局唯一性

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

do函數(shù)被unique裝飾,那么對(duì)于task_id對(duì)應(yīng)的任務(wù),全局只會(huì)執(zhí)行一次。

@uniquedef do(task_id): # do whatever pass

unique是怎樣實(shí)現(xiàn)的呢?

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四、總結(jié)

AOP在少量增加代碼復(fù)雜度的前提下,顯著的獲得以下優(yōu)點(diǎn):

1、使得功能邏輯和業(yè)務(wù)邏輯解耦,功能和業(yè)務(wù)的修改完全獨(dú)立,代碼結(jié)構(gòu)清晰,開(kāi)發(fā)方便

2、一鍵注入,代碼復(fù)用程度高,擴(kuò)展方便

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产69精品一区二区亚洲孕妇 | 成人国产精品视频| 天天影视网天天综合色在线播放| 2020国产精品久久精品美国| 欧美精品一卡二卡| 久久久精品动漫| 狠狠色狠狠色综合人人| 9l国产精品久久久久麻豆| 精品一区二区三区在线观看 | 欧美1区3d| 国产福利不卡视频| 国产自产视频一区二区三区| 亚洲午夜在线视频| 亚洲免费av观看| 中文字幕av一区二区三区| 精品粉嫩超白一线天av| 欧美日韩亚洲一区二区三区四区| 毛片不卡一区二区| 日本女优在线视频一区二区| 亚洲1区2区3区视频| 亚洲综合在线电影| 亚洲日本在线看| 亚洲男女一区二区三区| 国产精品午夜在线| 亚洲国产精品成人久久综合一区| 久久久三级国产网站| 久久久久久久久久久久久久久99| 精品国产乱码久久久久久影片| 欧美xxx在线观看| 99精品久久99久久久久| 99国产欧美久久久精品| 99re亚洲国产精品| 亚洲无线视频| 国产视频一区在线观看一区免费| 一区二区三区四区五区精品视频| 亚洲综合欧美日韩| 91福利小视频| 欧美一区二区三区在线| 欧美不卡在线视频| 国产视频一区二区三区在线观看| 中文字幕二三区不卡| 亚洲伦理在线精品| 日韩av中文字幕一区二区三区| 中文成人综合网| 91久久奴性调教| 欧美日韩精品三区| 日韩一级片在线观看| 国产午夜一区二区三区| 亚洲人成在线播放网站岛国| 亚洲一二三区不卡| 久久激五月天综合精品| 成人的网站免费观看| 影音国产精品| 欧亚洲嫩模精品一区三区| 欧美tickle裸体挠脚心vk| 国产精品国产三级国产有无不卡| 首页综合国产亚洲丝袜| 国产a区久久久| 亚洲精品看片| 国产精品日韩欧美一区二区三区| 欧美三区在线视频| 中文一区二区在线观看| 日韩精品色哟哟| 91网站最新地址| 久久精品国产精品青草| av激情综合网| 亚洲一区二区在线看| 日韩一级在线观看| 亚洲精品日产精品乱码不卡| 久久99精品久久久久婷婷| 欧美一区二区在线| 亚洲综合社区| 51精品国自产在线| 一区二区三区国产精品| 国产成人高清视频| 国产亚洲成人一区| 欧美一二三区在线| 一个色妞综合视频在线观看| 国产成人精品aa毛片| 免费久久精品视频| 成人福利视频在线| 欧美私人免费视频| 一区二区三区在线免费视频| 国产一区美女在线| 国产精品美女黄网| 国产色综合久久| 国产美女精品在线| 欧美亚洲免费| 国产精品黄色在线观看| 国产精品亚洲视频| 91福利精品视频| 专区另类欧美日韩| 亚洲色图清纯唯美| 99精品桃花视频在线观看| 色噜噜狠狠色综合欧洲selulu| 国产欧美精品一区二区色综合| 老司机免费视频一区二区| 午夜精品短视频| 免费成人小视频| 校园激情久久| 久久亚洲私人国产精品va媚药| 琪琪一区二区三区| 国产一区二区三区久久久久久久久 | 丁香亚洲综合激情啪啪综合| 另类天堂av| 亚洲一区二区三区视频在线| 亚洲成人直播| 国产精品久久久爽爽爽麻豆色哟哟| 顶级嫩模精品视频在线看| 欧美探花视频资源| 蜜桃精品视频在线| 欧美性videosxxxxx| 香蕉久久夜色精品国产使用方法 | 久久婷婷国产综合国色天香| 日本中文在线一区| 国产精品国产一区二区| 日韩亚洲欧美成人一区| 午夜精品久久久久久久蜜桃app | 久久久99精品免费观看| 成人性生交大片免费看视频在线| 欧美一级搡bbbb搡bbbb| 国产乱国产乱300精品| 欧美色成人综合| 精品亚洲欧美一区| 久久精彩视频| 亚洲欧洲av在线| 亚洲精选在线| 国产精品久久久久久久岛一牛影视| 成人深夜视频在线观看| 欧美zozo另类异族| av亚洲精华国产精华精华| 日韩视频一区二区三区| 国产在线精品一区二区不卡了| 中文亚洲字幕| 日韩av中文在线观看| 欧美体内she精高潮| 国产永久精品大片wwwapp| 欧美一区二区视频在线观看2022| 不卡一卡二卡三乱码免费网站| 精品国产91久久久久久久妲己 | 91精品国产综合久久精品app| 国产激情视频一区二区在线观看| 欧美变态tickling挠脚心| 99久久国产综合精品女不卡| 欧美国产丝袜视频| 亚洲人体一区| 蜜臀久久99精品久久久画质超高清| 欧美日韩亚洲不卡| 成人av影视在线观看| 中文字幕一区二区视频| 免费日韩av片| 国产精品夜夜嗨| 国产精品国产三级国产aⅴ入口| 99在线|亚洲一区二区| 蜜桃在线一区二区三区| 欧美在线免费观看视频| bt欧美亚洲午夜电影天堂| 综合色中文字幕| 在线观看免费视频综合| 亚洲精品第1页| 欧美三级电影网站| 欧美精品九九| 麻豆精品一区二区| 在线成人av网站| 亚洲久草在线视频| 欧美另类z0zxhd电影| 精品成人免费| 午夜欧美2019年伦理| 精品久久久久久亚洲综合网| 国产精品美女久久久| 久久国产精品免费| 亚洲精品一区二区三区香蕉| 一本色道88久久加勒比精品| 国产成人免费在线观看不卡| 亚洲精品日韩综合观看成人91| 日韩一区二区在线看片| 亚洲在线一区| 欧美精品国产一区二区| 欧美成人精品3d动漫h| 蜜桃av综合| 欧美高清视频一区| 极品美女销魂一区二区三区免费 | 亚洲成av人片在线| 精品播放一区二区| 色狠狠综合天天综合综合| 国产精品xxx在线观看www| 国产在线国偷精品产拍免费yy| 一区二区久久久久| 久久精品无码一区二区三区| 欧美日韩精品一区视频| 国产一区白浆| 欧美三级在线| 成人性视频免费网站| 日韩精品久久理论片| 亚洲欧美综合另类在线卡通| 欧美激情亚洲| 福利电影一区二区三区| 日韩中文字幕av电影| 亚洲一线二线三线久久久| 亚洲一区二区视频|