成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一日一技:在 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-09-13 20:38:47

Python鏈式調用

2021-03-12 21:19:15

Python鏈式調用

2024-02-20 22:13:48

Python項目Java

2021-04-12 21:19:01

PythonMakefile項目

2022-06-28 09:31:44

LinuxmacOS系統

2021-06-08 21:36:24

PyCharm爬蟲Scrapy

2022-03-12 20:38:14

網頁Python測試

2024-11-11 00:38:13

Mypy靜態類型

2024-11-13 09:18:09

2024-07-30 08:16:18

Python代碼工具

2021-04-05 14:47:55

Python多線程事件監控

2024-07-30 08:11:16

2021-10-06 23:17:26

Python抽象類接口

2021-10-15 21:08:31

PandasExcel對象

2021-04-27 22:15:02

Selenium瀏覽器爬蟲

2020-12-11 06:30:00

工具分組DataFrame

2024-10-16 21:47:15

2025-05-28 03:15:00

Scrapy數據sleep

2021-05-12 00:12:37

Ocelot網關密碼

2021-09-14 10:48:33

Ocelot網關
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品国产三级国产aⅴ入口 | 午夜精品久久久久久久99黑人 | 国产中文字幕在线 | www久久国产 | 黄网站涩免费蜜桃网站 | 一二区视频 | 99在线国产 | 欧美一级艳情片免费观看 | 激情综合五月 | 91美女在线 | 久久久精| 凹凸日日摸日日碰夜夜 | 欧美一区二区三区在线观看 | 日韩精品无码一区二区三区 | 日韩毛片在线免费观看 | 啪视频在线 | 久久视频精品 | 久国产视频| 7777久久 | 91在线导航| 精品国产乱码久久久久久牛牛 | 午夜影院| 黄视频网址 | 91精品国产综合久久久久蜜臀 | 96久久久久久| 日韩欧美专区 | 国产在线对白 | 亚洲人在线观看视频 | 久久涩涩| 成人免费大片黄在线播放 | 日本一区高清 | 99精品久久久 | 欧美精品一区二区三区四区 在线 | 99久久久久久久久 | 在线播放一区二区三区 | 亚洲精品视频在线 | 亚州影院 | 久久久久久国产精品 | 69堂永久69tangcom | 国产a区| 密桃av |