最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在 Linux/Mac 下為Python函數(shù)添加超時時間的方法

 更新時間:2020年02月20日 11:37:39   作者:青南  
這篇文章主要介紹了在 Linux/Mac 下為Python函數(shù)添加超時時間,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

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

但大家有沒有考慮過,如何為普通的函數(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來接管鍵盤的中斷信號,用到的是 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')

運行效果如下圖所示:

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

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

import time
import signal
class FuncTimeoutException(Exception):
  pass
def handler(signum, _):
  raise FuncTimeoutException('函數(shù)定時到了!')
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) # 函數(shù)提前運行完成,取消信號
      return result
    return wraps
  return decorator
signal.signal(signal.SIGALRM, handler)

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

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

正常拋出 FuncTimeoutException 異常。

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

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

當(dāng)然你如果想直接跳過這個異常也沒問題:

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

總結(jié)

以上所述是小編給大家介紹的在 Linux/Mac 下為Python函數(shù)添加超時時間的方法,希望對大家有所幫助,也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Python提取特定時間段內(nèi)數(shù)據(jù)的方法實例

    Python提取特定時間段內(nèi)數(shù)據(jù)的方法實例

    今天小編就為大家分享一篇關(guān)于Python提取特定時間段內(nèi)數(shù)據(jù)的方法實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • python動態(tài)網(wǎng)站爬蟲實戰(zhàn)(requests+xpath+demjson+redis)

    python動態(tài)網(wǎng)站爬蟲實戰(zhàn)(requests+xpath+demjson+redis)

    本文主要介紹了python動態(tài)網(wǎng)站爬蟲實戰(zhàn)(requests+xpath+demjson+redis),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java byte數(shù)組操縱方式代碼實例解析

    Java byte數(shù)組操縱方式代碼實例解析

    這篇文章主要介紹了Java byte數(shù)組操縱方式代碼實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • Python?tkinter中四個常用按鈕的用法總結(jié)

    Python?tkinter中四個常用按鈕的用法總結(jié)

    tkinter中有四個控件被冠以Button之名,分別是:Button,?Checkbutton,?Radiobutton,?Menubutton,下面小編就來和大家聊聊它們的具體用法,感興趣的可以學(xué)習(xí)一下
    2023-09-09
  • Python實現(xiàn)冒泡排序算法的示例解析

    Python實現(xiàn)冒泡排序算法的示例解析

    冒泡排序(Bubble Sort)是一種簡單的排序算法。本文將詳細為大家講講Python實現(xiàn)冒泡排序算法的方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-06-06
  • 基于python requests selenium爬取excel vba過程解析

    基于python requests selenium爬取excel vba過程解析

    這篇文章主要介紹了基于python requests selenium爬取excel vba過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • python調(diào)用HEG工具批量處理MODIS數(shù)據(jù)的方法及注意事項

    python調(diào)用HEG工具批量處理MODIS數(shù)據(jù)的方法及注意事項

    這篇文章主要介紹了python調(diào)用HEG工具批量處理MODIS數(shù)據(jù)的方法,本文給大家提到了注意事項,通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • Python __slots__的使用方法

    Python __slots__的使用方法

    這篇文章主要介紹了Python __slots__的使用方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • python項目報錯:bs4.FeatureNotFound:?Couldn‘t?find?a?tree?builder?with?the?features?you?requests

    python項目報錯:bs4.FeatureNotFound:?Couldn‘t?find?a?tree?bu

    這篇文章主要給大家介紹了python項目報錯:bs4.FeatureNotFound:?Couldn‘t?find?a?tree?builder?with?the?features?you?requests的解決方式,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Pytorch之parameters的使用

    Pytorch之parameters的使用

    今天小編就為大家分享一篇Pytorch之parameters的使用,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12

最新評論

茂名市| 珲春市| 南靖县| 长宁区| 周宁县| 凤凰县| 南陵县| 桐庐县| 靖江市| 昌邑市| 铁岭市| 台湾省| 攀枝花市| 通城县| 宜丰县| 顺平县| 水富县| 南川市| 揭东县| 松江区| 绥德县| 大新县| 广宗县| 汨罗市| 福建省| 八宿县| 萍乡市| 甘孜| 武强县| 丽江市| 姜堰市| 札达县| 宁都县| 咸丰县| 泽库县| 铜陵市| 东源县| 阜城县| 池州市| 保定市| 阿拉善盟|