国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

一日一技:在 Python 中實現延遲調用

開發 后端
熟悉 Golang 的同學都知道,Golang 里面有一個關鍵詞叫做defer,它可以實現延遲調用。實際上在 Python 里面也有相關的語法,那就是contextlib.ExitStack。

[[413590]]

熟悉 Golang 的同學都知道,Golang 里面有一個關鍵詞叫做defer,它可以實現延遲調用。

實際上在 Python 里面也有相關的語法,那就是contextlib.ExitStack。

我們來看這樣一個場景:

我有一個函數parse,它的作用是從 Redis 中持續讀入數據,并寫入到MongoDB 中。示例代碼如下:

  1. import json 
  2. import redis 
  3. import pymongo 
  4.  
  5. client = redis.Redis() 
  6. handler = pymongo.MongoClient().test.data 
  7.  
  8. def parse(): 
  9.     data = client.lpop('test'
  10.     if not data: 
  11.         return 
  12.     handler.insert_one(json.loads(data)) 

但現在我想增加一個需求,當Redis 讀取結束或者讀取數據報錯的時候,能把當前的時間也寫入到MongoDB 中。

那么代碼可能變成下面這樣:

  1. import json 
  2. import redis 
  3. import datetime 
  4. import pymongo 
  5.  
  6. client = redis.Redis() 
  7. handler = pymongo.MongoClient().test.data 
  8.  
  9. def parse(): 
  10.     while True
  11.         try: 
  12.             data = client.lpop('test'
  13.             if not data: 
  14.                 handler.insert_one({'finished'True'ts': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}) 
  15.                 return 
  16.             handler.insert_one(json.loads(data)) 
  17.         except Exception: 
  18.             handler.insert_one({'finished'True'ts': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'}) 

可以看到,代碼變得很難看了。

現在,我們可以使用延遲調用來讓代碼變得更好看。

要實現這個目的,就可以開始使用ExitStack了。它可以注冊多個回調函數,在退出上下文縮進時執行。

我們先來看一個簡單的例子:

  1. import contextlib 
  2.  
  3. def callback_1(): 
  4.     print('我是第一個回調函數'
  5.  
  6. def callback_2(x): 
  7.     print(f'我是第二個回調函數,傳入參數:{x}'
  8.  
  9.  
  10. with contextlib.ExitStack() as stack: 
  11.     stack.callback(callback_1) 
  12.     stack.callback(callback_2, 100) 
  13.     print(12345) 
  14.     print('xxxx'
  15. print('退出縮進'

運行效果如下圖所示:

可以看出以下特點:

  1. 被添加的回調函數進入了一個棧,所以后添加的回調函數先調用
  2. 回調函數會在結束縮進的時候被調用

現在我們來人工構造一個異常:

可以看到,即使縮進里面出現了報錯,回調函數仍然可以正常運行。等所有回調函數運行完成以后,Python 才會退出。

基于以上特點,我們就可以來重構最開始的代碼了:

  1. import json 
  2. import redis 
  3. import datetime 
  4. import pymongo 
  5. import contextlib 
  6.  
  7. client = redis.Redis() 
  8. handler = pymongo.MongoClient().test.data 
  9.  
  10. def add_ts(): 
  11.     handler.insert_one({'finished'True'ts': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}) 
  12.  
  13. def parse(): 
  14.     with contextlib.ExitStack() as stack: 
  15.         stack.callback(add_ts) 
  16.         while True
  17.             data = client.lpop('test'
  18.             if not data: 
  19.                 return 
  20.             handler.insert_one(json.loads(data)) 

 

無論是正常運行結束還是運行過程中報錯,add_ts函數都會正常運行,確保始終增加一條日期數據。

本文轉載自微信公眾號「未聞Code」,可以通過以下二維碼關注。轉載本文請聯系未聞Code公眾號。

 

責任編輯:武曉燕 來源: 未聞Code
相關推薦

2021-03-12 21:19:15

Python鏈式調用

2021-09-13 20:38:47

Python鏈式調用

2024-02-20 22:13:48

Python項目Java

2021-04-12 21:19:01

PythonMakefile項目

2021-06-08 21:36:24

PyCharm爬蟲Scrapy

2022-06-28 09:31:44

LinuxmacOS系統

2024-11-11 00:38:13

Mypy靜態類型

2022-03-12 20:38:14

網頁Python測試

2024-07-30 08:16:18

Python代碼工具

2021-04-05 14:47:55

Python多線程事件監控

2024-11-13 09:18:09

2024-07-30 08:11:16

2021-10-06 23:17:26

Python抽象類接口

2024-10-16 21:47:15

2021-04-27 22:15:02

Selenium瀏覽器爬蟲

2021-10-15 21:08:31

PandasExcel對象

2025-05-28 03:15:00

Scrapy數據sleep

2020-12-11 06:30:00

工具分組DataFrame

2021-09-14 10:48:33

Ocelot網關

2021-05-12 00:12:37

Ocelot網關密碼
點贊
收藏

51CTO技術棧公眾號

国产精品尤物| 精品女同一区二区三区在线播放 | 韩日成人在线| 欧美日韩三级一区| 精品久久久久久中文字幕动漫| 日韩中文在线| 亚洲福利在线播放| 暖暖日本在线观看| 精品国产乱码久久久久久虫虫漫画 | 亚洲精品激情| 91成人在线观看国产| 亚洲福利影视| 亚洲国产成人爱av在线播放| dj大片免费在线观看| 五月天中文字幕一区二区| 啊啊啊射了视频网站| 久久久久久久久久久久久女国产乱| 国产精品久久久影院| 日本不卡视频在线| 色视频一区二区三区| 亚洲免费网站| 日产精品久久久一区二区| 国产九九精品| 日韩欧美精品一区二区| 久久先锋资源| 亚洲一区二区三区免费观看| 日本亚洲三级在线| 中文字幕在线亚洲精品| 国内外成人在线| 久久男人资源站| 波多野结衣中文一区| 欧美 日韩 国产 高清| 久久蜜桃一区二区| 亚洲天堂网一区| 亚洲在线视频免费观看| 国外av在线| 欧美一级黄色录像| 人在线成免费视频| 免费91在线视频| 亚洲人成精品久久久| 91传媒在线免费观看| 国产精品日韩| 久久av秘一区二区三区| 99精品视频在线播放观看| 国产美女三级视频| 樱花影视一区二区| 成年人在线观看视频| 国产视频精品xxxx| 91蜜桃臀久久一区二区| 国产精品中文字幕在线观看| 久久九九国产| 欧美在线观看视频网站| 欧美性高跟鞋xxxxhd| av人人综合网| 欧美激情乱人伦一区| 一区二区不卡| 熟妇熟女乱妇乱女网站| 中文字幕+乱码+中文字幕一区| 韩国精品视频| 日韩精品www| 免费欧美激情| 一区二区高清视频| 亚洲蜜臀av乱码久久精品蜜桃| 国内外激情在线| 不卡av电影院| 亚洲美女黄色| 午夜国产一区二区三区| 777午夜精品免费视频| 精品视频在线观看免费观看| 亚洲字幕一区二区| 成人精品亚洲人成在线| 一级片免费视频| 亚洲国产天堂久久综合| 日本成人a网站| 精品久久免费观看| 精品国产91久久久| 中文字幕系列一区| 国产精品二区三区四区| 91亚洲国产成人精品一区二区三| 国产免费av高清在线| 久久在线精品视频| 老司机午夜免费精品视频| 亚洲一级免费在线观看| 亚洲精品一区二区三区四区高清| 精品freesex老太交| 97在线国产视频| 欧美一区二区三区视频免费| 国产欧美日韩免费观看| 2018中文字幕第一页| 欧美日韩高清一区| youjizz.com亚洲| 中文字幕一精品亚洲无线一区 | 欧美大学生性色视频| 一本色道久久综合亚洲精品高清 | 7777精品伊久久久大香线蕉语言| 97精品久久久午夜一区二区三区| av在线女优影院| 91国内在线视频| 中文字幕在线视频免费观看| 99久久精品久久久久久ai换脸| 久久久久久久久97黄色工厂| 成人av免费| 国产一区二区三区高清在线观看| 久久伊人亚洲| 日韩经典av| 亚洲黄色一区二区三区| 亚洲精品极品少妇16p| 国产精品涩涩涩视频网站| 精品国产欧美一区二区| 激情综合电影网| 黄页网站在线观看| 午夜精品久久久久久久久久久久 | 成人亚洲综合色就1024| 久久久久久久综合狠狠综合| 都市激情国产精品| 欧美一级二级三级九九九| 91福利在线免费观看| 精品久久美女| 18岁视频在线观看| 日本高清不卡在线| 欧美制服丝袜第一页| 97精品国产97久久久久久| 国产做a爰片久久毛片| 不卡av免费观看| 大伊香蕉精品视频在线| 欧美三级资源在线| 久久欧美肥婆一二区| 韩国三级大全久久网站| 久久久久久国产三级电影| 国产成人av网站| av蜜臀在线| aaa免费在线观看| 精品国产露脸精彩对白| 男女激情视频一区| 无码小电影在线观看网站免费| 视频一区三区| 亚洲欧洲国产一区| 99精品视频中文字幕| 亚洲国产精品免费视频| www.天天射.com| 91av中文字幕| 亚洲一区二区三区精品在线| 日韩av有码| 五丁香在线视频| 国产91免费视频| 日韩欧美一级二级三级| 精品一区二区三区免费毛片爱 | 亚洲精品三区| 少妇人妻互换不带套| 操日韩av在线电影| 中文字幕一区二区三区四区不卡| 啪啪国产精品| 四虎影视在线播放| 日本亚洲自拍| 国产亚洲美女久久| 亚洲成人综合在线| 亚洲精品写真福利| 欧美视频精品在线观看| 成人片在线播放| 日韩精品久久一区| 日韩av男人的天堂| 精品国产一二| 不卡中文字幕在线| 精品美女视频在线观看免费软件| 国产激情在线视频| 亚洲黄色免费看| 日韩成人精品一区二区三区| 日韩大片在线永久免费观看网站| 欧美日韩经典丝袜| 182在线播放| 狠狠一区二区三区| 免费看av成人| 大奶在线精品| 精品国产一区二区三区成人影院| 四虎8848精品成人免费网站| 国产精品一区一区三区| 亚洲男人的天堂在线aⅴ视频| 亚洲欧美中文日韩在线| 97国产精品视频| 激情视频免费网站| 日本精品一区二区三区四区| 9久久9毛片又大又硬又粗| 在线看三级网站视频| 亚洲黄色免费看| 久久综合电影| 亚洲天堂福利av| 成人两性免费视频| 免费人成在线观看视频播放| 国产精品论坛| 欧美日韩国产传媒| 香蕉精品视频在线观看| 久草在线在线精品观看| 五月婷婷久久综合| 色偷偷噜噜噜亚洲男人| 国产日韩精品入口| 欧美国产综合视频| 狠狠操第一页| 青青青草视频在线| 欧美成人综合| 欧美精品少妇一区二区三区|