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

python程序超時(shí)處理方式

 更新時(shí)間:2023年08月17日 15:10:02   作者:何小義的AI進(jìn)階路  
這篇文章主要介紹了python程序超時(shí)處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

python程序超時(shí)處理

下面這個(gè)小案例,實(shí)現(xiàn)對(duì)某個(gè)函數(shù)超時(shí)處理:

其實(shí)就是加了一個(gè)裝飾器timeout

import time
import timeout_decorator
@timeout_decorator.timeout(6)
def justtest():
    time.sleep(5)
    return 5
aaa = justtest()
print aaa

上面代碼我們規(guī)定若函數(shù)運(yùn)行時(shí)間超過6s  就報(bào)錯(cuò)。

5s是可以的,所以正常運(yùn)行,運(yùn)行結(jié)果:

如果我們?cè)O(shè)定程序不可超過3s,

import time
import timeout_decorator
@timeout_decorator.timeout(3)
def justtest():
    time.sleep(5)
    return 5
aaa = justtest()
print aaa

運(yùn)行結(jié)果:

python超時(shí)處理方法介紹,Eventlet 和 func-timeout

有一些場(chǎng)景,需要我們控制程序或者腳本的運(yùn)行時(shí)間。 

  • 自動(dòng)化用例中的某一個(gè)步驟需要在規(guī)定時(shí)間內(nèi)完成才算有效;    
  • 使用線程池控制線程運(yùn)行時(shí),我們不希望每個(gè)線程運(yùn)行時(shí)間超過某一值;    
  • 在爬蟲時(shí)發(fā)送的request請(qǐng)求,我們希望在規(guī)定時(shí)間內(nèi)無響應(yīng)則跳過該請(qǐng)求;    
  • 當(dāng)寫入了一條錯(cuò)誤的sql查詢語句可能會(huì)導(dǎo)致該查詢語句一直運(yùn)行,導(dǎo)致其他查詢語句阻塞時(shí)等等場(chǎng)景

以上場(chǎng)景中,如果我們?cè)诔绦蛑性O(shè)置了超時(shí)處理,那將會(huì)為我們的程序節(jié)約很多運(yùn)行時(shí)間。

1.eventlet

安裝: 

pip install eventlet

eventlet在代碼中的使用:

import time
import eventlet                     # 導(dǎo)入eventlet模塊
eventlet.monkey_patch()             # 引入patch
with eventlet.Timeout(3, False):    # 設(shè)置超時(shí)時(shí)間3秒
    time.sleep(4)                   # 等待4秒
    print('結(jié)果1')                   # 因?yàn)榈却?秒,大于超時(shí)時(shí)間,所以'結(jié)果1‘不打印
print('結(jié)果2')
# 運(yùn)行以上程序輸出:
# 結(jié)果2
with eventlet.Timeout(3, False):    # 設(shè)置超時(shí)時(shí)間3秒
    time.sleep(2)                   # 等待2秒
    print('結(jié)果3')                   # 因?yàn)榈却?秒,小于超時(shí)時(shí)間,所以'結(jié)果3‘也會(huì)打印
print('結(jié)果4')
# 運(yùn)行以上程序輸出:
# 結(jié)果3
# 結(jié)果4

注意:eventlet方法中只要進(jìn)行了子進(jìn)程的調(diào)用,超時(shí)設(shè)置就會(huì)失效。示例:

import time
import os
import eventlet                     # 導(dǎo)入eventlet模塊
from multiprocessing import Process
def my_test(name):
    print('子進(jìn)程運(yùn)行中,name={},pid={}'.format(name, os.getpid()))
    time.sleep(10)
    print('子進(jìn)程已經(jīng)結(jié)束')
if __name__ == '__main__':
    eventlet.monkey_patch()                                 # 引入patch
    with eventlet.Timeout(3, False):                        # 這里設(shè)置了超時(shí)時(shí)間3
        print('父進(jìn)程:{}'.format(os.getpid()))
        p = Process(target=my_test, args=('test', ))        # 調(diào)用了子進(jìn)程,子進(jìn)程內(nèi)有等待10秒的步驟,等待完才會(huì)打印'子進(jìn)程已經(jīng)結(jié)束‘
        print('子進(jìn)程準(zhǔn)備執(zhí)行---')
        p.start()
# 執(zhí)行以上程序輸出:
# 父進(jìn)程:11548
# 子進(jìn)程準(zhǔn)備執(zhí)行 - --
# 子進(jìn)程運(yùn)行中,name = test,pid = 1996
# 子進(jìn)程已經(jīng)結(jié)束

從以上示例可以看出,設(shè)置的超時(shí)時(shí)間3秒沒有生效。這種情況,我們只能將超時(shí)處理步驟加到my_test函數(shù)中即可:

def my_test(name):
    print('子進(jìn)程運(yùn)行中,name={},pid={}'.format(name, os.getpid()))
    eventlet.monkey_patch()                                 # 引入patch
    with eventlet.Timeout(3, False):
        time.sleep(10)
        print('等待時(shí)間結(jié)束')
    print('子進(jìn)程已經(jīng)結(jié)束')

2.func-timeout

安裝:

pip install func-timeout

func-timeout 在代碼中的使用,func-timeout主要有兩中方法:func_timeout,func_set_timeout

2.1 func_set_timeout 用法

# func_set_timeout作為裝飾器使用,來作為目標(biāo)函數(shù)的超時(shí)處理方式
import time
import os
from func_timeout import func_set_timeout
@func_set_timeout(5)
def my_test(name):
    print('子進(jìn)程運(yùn)行中,name={},pid={}'.format(name, os.getpid()))
    time.sleep(4)			
    print('子進(jìn)程已經(jīng)結(jié)束')
if __name__ == '__main__':
    print('父進(jìn)程:{}'.format(os.getpid()))
    try:
        p = Process(target=my_test, args=('test', ))
        p.start()
    except TimeoutError as e:
        print('子程序超時(shí)')
# 執(zhí)行以上程序輸出:
# 父進(jìn)程:29908
# 結(jié)束
# 子進(jìn)程運(yùn)行中,name=test,pid=40280
# 子進(jìn)程已經(jīng)結(jié)束
# 說明:my_test函數(shù)執(zhí)行需要4s,設(shè)置的超時(shí)時(shí)間大于4s,因此子進(jìn)程正常執(zhí)行;若設(shè)置my_test函數(shù)執(zhí)行時(shí)間大于5s,則報(bào)錯(cuò),代碼中嘗試了通過捕獲異常來讓程序正常運(yùn)行退出,但超時(shí)異常時(shí)發(fā)生在子進(jìn)程中的,因此捕獲異常失敗,此時(shí)的報(bào)錯(cuò)見圖1。

圖1:

2.2 func_timeout 用法

import time
import os
from func_timeout import func_timeout
from func_timeout import FunctionTimedOut
def my_test(name):
    print('進(jìn)程運(yùn)行中,name={},pid={}'.format(name, os.getpid()))
    time.sleep(6)
    print('進(jìn)程已經(jīng)結(jié)束')
if __name__ == '__main__':
    try:
        func_timeout(3, my_test, args=('test', ))
    except FunctionTimedOut as e:
        print(e)
        print('進(jìn)程運(yùn)行超時(shí)')
# 輸出:
# 進(jìn)程運(yùn)行中,name=test,pid=3364
# Function my_test (args=('test',)) (kwargs={}) timed out # after 3.000000 seconds.
# 進(jìn)程運(yùn)行超時(shí)
# 說明:func_timeout()第一個(gè)參數(shù)為超時(shí)時(shí)間,第二個(gè)參數(shù)是調(diào)用的函數(shù),注意這里只調(diào)用函數(shù)名,沒有(), 第三個(gè)參數(shù)是調(diào)用函數(shù)的參數(shù)。這里使用的異常捕獲也不能解決2.1中的報(bào)錯(cuò)問題。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python自動(dòng)化辦公實(shí)戰(zhàn)案例詳解(Word、Excel、Pdf、Email郵件)

    Python自動(dòng)化辦公實(shí)戰(zhàn)案例詳解(Word、Excel、Pdf、Email郵件)

    這篇文章基于Python自動(dòng)化辦公,主要介紹了使用Python相關(guān)庫(kù),依次完成Word文檔替換、Excel表格讀取、Pdf文件生成和Email自動(dòng)郵件發(fā)送任務(wù)。感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2021-12-12
  • Python while循環(huán)的基本用法與終止條件

    Python while循環(huán)的基本用法與終止條件

    本章詳細(xì)介紹了Python中的while循環(huán)的基本用法與終止條件,包括其重要性應(yīng)用場(chǎng)景技術(shù)原理實(shí)現(xiàn)方法關(guān)鍵技術(shù)點(diǎn)等進(jìn)階示例常見問題與解決方案最佳實(shí)踐等內(nèi)容最后總結(jié)了核心要點(diǎn)并提供思考題一步驟建議和延伸閱讀建議,需要的朋友可以參考下
    2026-05-05
  • Python實(shí)現(xiàn)數(shù)據(jù)可視化圖表生成(適合新手入門)

    Python實(shí)現(xiàn)數(shù)據(jù)可視化圖表生成(適合新手入門)

    在數(shù)據(jù)科學(xué)和數(shù)據(jù)分析的新時(shí)代,高效、直觀的數(shù)據(jù)可視化工具顯得尤為重要,下面這篇文章主要介紹了Python實(shí)現(xiàn)數(shù)據(jù)可視化圖表生成的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-08-08
  • python selenium登錄豆瓣網(wǎng)過程解析

    python selenium登錄豆瓣網(wǎng)過程解析

    這篇文章主要介紹了python selenium登錄豆瓣網(wǎng)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python學(xué)習(xí)教程之常用的內(nèi)置函數(shù)大全

    Python學(xué)習(xí)教程之常用的內(nèi)置函數(shù)大全

    python給我們提供了很多已經(jīng)定義好的函數(shù),下面這篇文章主要給大家介紹了關(guān)于Python學(xué)習(xí)教程之一些常用的內(nèi)置函數(shù),文中分享了關(guān)于數(shù)學(xué)函數(shù)、功能函數(shù)、類型轉(zhuǎn)換函數(shù)、字符串處理和序列處理函數(shù)的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • 基于Python實(shí)現(xiàn)浪漫的彈窗祝福滿屏飄字效果(附完整代碼)

    基于Python實(shí)現(xiàn)浪漫的彈窗祝福滿屏飄字效果(附完整代碼)

    這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)浪漫的彈窗祝福滿屏飄字效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解下
    2026-01-01
  • python腳本監(jiān)聽域名證書過期時(shí)間并通知消息到釘釘(最新推薦)

    python腳本監(jiān)聽域名證書過期時(shí)間并通知消息到釘釘(最新推薦)

    這篇文章主要介紹了python腳本監(jiān)聽域名證書過期時(shí)間并通知消息到釘釘(最新推薦),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-11-11
  • 對(duì)django 2.x版本中models.ForeignKey()外鍵說明介紹

    對(duì)django 2.x版本中models.ForeignKey()外鍵說明介紹

    這篇文章主要介紹了對(duì)django 2.x版本中models.ForeignKey()外鍵說明介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • 用TensorFlow實(shí)現(xiàn)戴明回歸算法的示例

    用TensorFlow實(shí)現(xiàn)戴明回歸算法的示例

    這篇文章主要介紹了用TensorFlow實(shí)現(xiàn)戴明回歸算法的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • python 同時(shí)讀取多個(gè)文件的例子

    python 同時(shí)讀取多個(gè)文件的例子

    今天小編就為大家分享一篇python 同時(shí)讀取多個(gè)文件的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07

最新評(píng)論

郴州市| 阿荣旗| 晋州市| 奉贤区| 榆社县| 阳原县| 延安市| 峡江县| 天峨县| 太原市| 英山县| 金堂县| 拉孜县| 唐山市| 长沙市| 安龙县| 施甸县| 周宁县| 太和县| 仁布县| 屏山县| 宣武区| 弥勒县| 贺州市| 防城港市| 佛山市| 阿巴嘎旗| 肥东县| 昭平县| 寿光市| 常德市| 大安市| 海盐县| 诏安县| 托里县| 吉隆县| 诸城市| 丹寨县| 霍山县| 龙里县| 绥芬河市|