日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
在Linux/Mac下為Python函數(shù)添加超時時間

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

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),永興企業(yè)網(wǎng)站建設(shè),永興品牌網(wǎng)站建設(shè),網(wǎng)站定制,永興網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,永興網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

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

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

如果你的電腦操作系統(tǒng)是 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函數(shù)中,然后使用signal.alarm(10)延遲10秒發(fā)送一個信號。10秒到了以后,函數(shù)handler被運行。在函數(shù)中拋出了一個異常,導致程序結(jié)束。clac_statistic函數(shù)原本要運行100秒,但是在10秒以后就停止了,從而實現(xiàn)了函數(shù)的超時功能。

基于以上原理,我們實現(xiàn)一個裝飾器,來簡化為不同函數(shù)設(shè)置超時功能:

 
 
 
 
  1. import time 
  2. import signal 
  3.  
  4.  
  5. class FuncTimeoutException(Exception): 
  6.     pass 
  7.  
  8. def handler(signum, _): 
  9.     raise FuncTimeoutException('函數(shù)定時到了!') 
  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)  # 函數(shù)提前運行完成,取消信號 
  19.             return result 
  20.         return wraps 
  21.     return decorator 
  22.  
  23. signal.signal(signal.SIGALRM, handler) 

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

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

正常拋出FuncTimeoutException異常。

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

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

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

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

名稱欄目:在Linux/Mac下為Python函數(shù)添加超時時間
鏈接URL:http://www.5511xx.com/article/cddjjsp.html