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

在 Linux/Mac 下為Python函數添加超時時間

開發 后端
我們在使用 requests 這類網絡請求第三方庫時,可以看到它有一個參數叫做timeout,就是指在網絡請求發出開始計算,如果超過 timeout 還沒有收到返回,就拋出超時異常。

 我們在使用 requests 這類網絡請求第三方庫時,可以看到它有一個參數叫做timeout,就是指在網絡請求發出開始計算,如果超過 timeout 還沒有收到返回,就拋出超時異常。(當然存在特殊情況timeout 會失效,請看Timeouts and cancellation for humans*[1] 這篇文章中作者的舉例,我們不考慮這種特殊情況)。

[[315558]]

但大家有沒有考慮過,如何為普通的函數設置超時時間?特別是在運行一些數據處理、AI 相關的代碼時,某個函數可能會運行很長時間,我們想實現,在函數運行超過特定的時間時,自動報錯。

例如有這樣一個場景,我寫了一個函數calc_statistic(datas),根據用戶傳入的數據計算某個值。但如果用戶傳入的數據非常大,這個函數就可能運行很長時間。我想設置讓這個函數最多運行10秒鐘。如果10秒還沒有運行完成,就報錯。應該怎么辦呢?

如果你的電腦操作系統是 Linux 或者 macOS,那么 可以使用 signal 來解決。

在公眾號前幾天的文章中,我們介紹了使用signal來接管鍵盤的中斷信號:《一日一技:在 Python 中接管鍵盤中斷信號》,用到的是signal.SIGINT。今天我們要用到的是signal.SIGALRM。

首先我們來看看這個信號的使用方法:

 

  1. import time 
  2. import signal 
  3.  
  4.  
  5. def handler(signum, _): 
  6.     print('定時到!'
  7.     raise Exception('定時到了!'
  8.  
  9. def clac_statistic(datas): 
  10.     time.sleep(100) 
  11.      
  12.  
  13. signal.signal(signal.SIGALRM, handler) 
  14. signal.alarm(5) 
  15. clac_statistic('xxx'

運行效果如下圖所示:

 

首先綁定signal.SIGALRM事件到handler函數中,然后使用signal.alarm(10)延遲10秒發送一個信號。10秒到了以后,函數handler被運行。在函數中拋出了一個異常,導致程序結束。clac_statistic函數原本要運行100秒,但是在10秒以后就停止了,從而實現了函數的超時功能。

基于以上原理,我們實現一個裝飾器,來簡化為不同函數設置超時功能:

 

  1. import time 
  2. import signal 
  3.  
  4.  
  5. class FuncTimeoutException(Exception): 
  6.     pass 
  7.  
  8. def handler(signum, _): 
  9.     raise FuncTimeoutException('函數定時到了!'
  10.  
  11. def func_timeout(times=0): 
  12.     def decorator(func): 
  13.         if not times: 
  14.             return func 
  15.         def wraps(*args, **kwargs): 
  16.             signal.alarm(times) 
  17.             result = func(*args, **kwargs) 
  18.             signal.alarm(0)  # 函數提前運行完成,取消信號 
  19.             return result 
  20.         return wraps 
  21.     return decorator 
  22.  
  23. signal.signal(signal.SIGALRM, handler) 

我們來試一試測試一下這個函數超時裝飾器。首先測試函數的運行時間小于超時時間時,程序正常運行沒有問題:

 

再來測試一下函數運行時間超過超時時間的情況:

正常拋出FuncTimeoutException異常。

那我們在實際使用中,可以使用try...except FuncTimeoutException捕獲這個異常,然后實現自定義的處理流程,例如:

 

  1. try: 
  2.     clac_statistic(100) 
  3. except FuncTimeException: 
  4.     print('該函數運行超時,運行自定義的處理流程'

當然你如果想直接跳過這個異常也沒問題,參考《一日一技:不使用 try...except 掩蓋一些已知異常》

 

  1. import contextlib: 
  2. with contextlib.supress(FuncTimeException): 
  3.     clac_statistic(100) 

 

責任編輯:華軒 來源: 未聞Code
相關推薦

2009-03-05 09:18:13

LinuxUbuntuMySQL

2009-07-06 18:09:18

linuxApache密碼

2023-03-01 10:42:58

gRPC服務端設置

2016-09-19 09:15:49

Windows 10鎖屏超時

2025-02-12 08:47:07

SpringAPI接口

2023-10-12 08:54:20

Spring事務設置

2024-09-10 09:05:12

SpringREST并發

2023-08-14 21:54:41

OptionsFeign接口

2023-11-29 07:40:12

分布式

2019-07-22 15:20:40

Linux系統病毒

2024-02-28 12:41:00

源碼內核參數

2009-04-15 20:52:37

Linux設置IPMAC綁定

2010-03-03 17:14:10

Linux路由設置ip

2010-04-21 13:21:24

Oracle時間

2014-05-22 15:38:27

Android消息處理機制Looper

2024-03-29 00:00:00

JSAPI網絡

2025-01-15 00:00:10

2009-12-09 10:16:39

ibmdwLotus

2011-11-17 09:17:04

開發LinuxMacOS

2022-03-03 13:22:52

LinuxKDE PlasmaKDE
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99国内精品| 波多野结衣精品在线 | 国产99久久精品一区二区永久免费 | 欧美日韩在线免费观看 | 国产美女在线免费观看 | 日日躁狠狠躁aaaaxxxx | 黄色免费在线网址 | 久热中文字幕 | 精品国产一区二区三区久久影院 | 亚洲一区二区三区在线观看免费 | 欧美精品一区二区三区四区 在线 | 精品亚洲视频在线 | 成人精品毛片 | 天天操 天天操 | 成人在线视频网址 | 久久国产高清 | 精品久久久久一区 | 国产成人福利在线观看 | 国产精品射 | 日韩福利 | 欧美影院久久 | 久久精品97 | 免费午夜电影 | 91视视频在线观看入口直接观看 | 国产精品1区2区 | 成人欧美一区二区三区视频xxx | 国产91av视频 | 美女131mm久久爽爽免费 | 一区二区国产精品 | 亚洲午夜精品一区二区三区他趣 | 丝袜美腿一区 | 综合久久亚洲 | 欧美中文字幕一区二区三区亚洲 | 久久久久国 | 国产高清在线 | 国产高清视频一区 | 精品国产免费一区二区三区五区 | 久久草在线视频 | 国产精品久久精品 | 久久在线| 草草草影院 |