亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-05-25 09:59:09 來源:億速云 閱讀:143 作者:小新 欄目:開發技術

這篇文章主要介紹在Linux/Mac下如何為Python函數添加超時時間,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

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

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

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

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

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

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

import time
import signal
def handler(signum, _):
  print('定時到!')
  raise Exception('定時到了!')
def clac_statistic(datas):
  time.sleep(100)
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)
clac_statistic('xxx')

運行效果如下圖所示:

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

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

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

import time
import signal
class FuncTimeoutException(Exception):
  pass
def handler(signum, _):
  raise FuncTimeoutException('函數定時到了!')
def func_timeout(times=0):
  def decorator(func):
    if not times:
      return func
    def wraps(*args, **kwargs):
      signal.alarm(times)
      result = func(*args, **kwargs)
      signal.alarm(0) # 函數提前運行完成,取消信號
      return result
    return wraps
  return decorator
signal.signal(signal.SIGALRM, handler)

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

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

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

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

正常拋出 FuncTimeoutException 異常。

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

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

當然你如果想直接跳過這個異常也沒問題:

import contextlib:
with contextlib.supress(FuncTimeException):
  clac_statistic(100)

以上是“在Linux/Mac下如何為Python函數添加超時時間”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

裕民县| 房产| 游戏| 鸡东县| 平泉县| 峨边| 临沂市| 罗源县| 芮城县| 靖远县| 盐池县| 武鸣县| 乌审旗| 济宁市| 怀仁县| 信丰县| 昌都县| 民和| 普格县| 浏阳市| 岗巴县| 保定市| 绍兴县| 栖霞市| 内乡县| 云安县| 东兰县| 揭阳市| 崇义县| 乐陵市| 灵璧县| 清河县| 孝义市| 玉山县| 响水县| 北安市| 星子县| 时尚| 太谷县| 迁安市| 临邑县|