国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

Python 中@lazyprop 裝飾器的用法

瀏覽:10日期: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注解,大家知道被這個注解注釋的函數(shù)立即就能獲得DB的事務能力。

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

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

二、上下文管理器contextlib

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

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

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

三、裝飾器:AOP的語法糖

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

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

1、重試邏輯

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

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

那retry_exp是如何實現(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、降級開關

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

@degradedef do(app): # do whatever pass

那么degrade是怎樣實現(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、任務狀態(tài)機

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

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

@tasks_decoratordef do(item_param): # do whatever pass

tasks_decorator是怎樣實現(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是需要額外的邏輯的,其實主要是實現(xiàn)唯一鍵,一旦唯一鍵實現(xiàn)了,就可以使用公共緩存redis進行唯一鍵判定了。

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

@uniquedef do(task_id): # do whatever pass

unique是怎樣實現(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四、總結

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

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

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

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

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 中文字幕亚洲另类天堂 | 国产精品a人片在线观看 | 亚洲成a人片在线播放 | 成人毛片一区二区三区 | 久草在线最新视频 | 欧美一级免费观看 | 国产在线观看一区二区三区四区 | 国产日韩欧美久久久 | 亚洲在线免费观看 | 日韩在线网| 国产乱码精品一区二区三区卡 | 亚洲精品一区二区不卡 | 一区在线免费 | 久草在线手机 | 欧美一区二区三区在线观看 | 国产成人精品视频免费大全 | 成人久久18网站 | 国产成人mv在线观看入口视频 | 国产亚洲国产bv网站在线 | 日产一区2区三区有限公司 日产一区两区三区 | 国产亚洲一级精品久久 | japanese日本tube色系 | 国产美女视频网站 | 黄色三级理沦片 | 欧美视频自拍偷拍 | 国产日韩精品欧美一区喷 | www.亚洲成人.com | 免费一级欧美在线观看视频片 | 91国内在线| 久久久久香蕉视频 | 成年人在线观看免费 | 久久精品国产三级不卡 | 国内精品久久久久久久aa护士 | 欧美成人h版在线观看 | 午夜67194| 九草在线观看 | 精品亚洲欧美高清不卡高清 | 免费中文字幕一级毛片 | 一级片高清 | 久久国产精品免费 | 99看视频|