Python使用裝飾器和線程限制函數(shù)執(zhí)行時間的方法

前言:

??(不想看廢話的可以直接copy尾部的代碼)
??在八月上旬的時候获洲,曾經(jīng)寫過一個多線程爬蟲磨取。程序在運行時經(jīng)常莫名的卡死元潘。這令我很是費解畔乙,后來才發(fā)現(xiàn),是在請求對方資源時翩概,服務(wù)器長時間未返回完數(shù)據(jù)牲距。導(dǎo)致IO阻塞。
??其實不只是爬蟲钥庇,很多時候一個函數(shù)很可能因為某種不可預(yù)知的事情牍鞠,而有時很可能會卡在某一處,繼而函數(shù)無法繼續(xù)執(zhí)行下去上沐。導(dǎo)致?lián)砣?br> ??此時皮服,我們自然而然的會想到如果能寫一個裝飾器來限制一個函數(shù)執(zhí)行的時間,那么問題也就迎刃而解了参咙。

正文:

??最初,因為我的擁塞是發(fā)生在多進程中硫眯,我曾經(jīng)想通過殺死線程的方式來解決問題蕴侧。然而python中的threading模塊中并沒有提供這一方法。網(wǎng)上有類似方法两入,但是比較繁瑣净宵。并且非常不建議直接殺死線程(這其中可能關(guān)系到資源釋放的問題,比如我從隊列中取出了一個url裹纳, 然而我的進程卡死了择葡,并沒有完成相應(yīng)的任務(wù),我卻強行得終止了這個線程剃氧,url中的內(nèi)容未采集敏储,url也沒用放回到隊列中,豈不是造成了資源的浪費)朋鞍。后來想到可以直接對函數(shù)的運行時間進行限制已添,這樣就省了不少事情。

方法一:

??此方法比較容易理解滥酥,寫了一個裝飾器更舞,看到其中的__wrapper函數(shù),新建了一個守護線程坎吻,target是我們需要限制時間的函數(shù)缆蝉。啟動守護線程之后,主線程sleep(timer)(timer就是我們設(shè)定的函數(shù)運行時間)。若在規(guī)定的運行時間未結(jié)束守護進程(也就是我們需要限制運行時間的函數(shù))刊头,則主動拋出異常贝搁。(但此種方法有一個弊端,就是如果函數(shù)在目標(biāo)時間內(nèi)運行完了芽偏,由于sleep的原因雷逆,整個線程還是會等到sleep(timer)后結(jié)束,可能會浪費時間)

#!/usr/bin/env python
#-*- coding:utf-8 -*- 
#Author: Chen
import threading
import time

def time_limited(timer):
    '''
    一個規(guī)定函數(shù)執(zhí)行時間的裝飾器
    :param timer:
    :return:
    '''
    def wrapper(func):
        def __wrapper(params):
            start_time = time.time()
            #通過設(shè)置守護線程強制規(guī)定函數(shù)的運行時間
            t = threading.Thread(target=func, args=params)
            t.setDaemon(True)
            t.start()
            time.sleep(timer)
            if t.is_alive():
                #若在規(guī)定的運行時間未結(jié)束守護進程污尉,則主動拋出異常
                raise Exception('Function execution timeout')
            #print time.time()-start_time
        return __wrapper
    return wrapper

第二種:

??此種方法是第一種的升級膀哲,改進了函數(shù)運行完不結(jié)束的弊端

#!/usr/bin/env python
#-*- coding:utf-8 -*- 
#Author: Chen
import time
from threading import Thread

ThreadStop = Thread._Thread__stop#獲取私有函數(shù)
def time_limited_pri(time_limited):
    def wrapper(func):
        def __wrapper(params):
            class TimeLimited(Thread):
                def __init__(self):
                    Thread.__init__(self)
                def run(self):
                    func(params)
                def _stop(self):
                    if self.is_alive():
                        ThreadStop(self)
                        raise Exception('Function execution overtime')
            t = TimeLimited()
            t.start()
            t.join(timeout=time_limited)
            if t.is_alive():
                t._stop()
                raise Exception('Function execution overtime')
        return __wrapper
    return wrapper
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市被碗,隨后出現(xiàn)的幾起案子某宪,更是在濱河造成了極大的恐慌,老刑警劉巖锐朴,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兴喂,死亡現(xiàn)場離奇詭異,居然都是意外死亡焚志,警方通過查閱死者的電腦和手機衣迷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酱酬,“玉大人壶谒,你說我怎么就攤上這事∩殴粒” “怎么了汗菜?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長挑社。 經(jīng)常有香客問我陨界,道長,這世上最難降的妖魔是什么痛阻? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任菌瘪,我火速辦了婚禮,結(jié)果婚禮上录平,老公的妹妹穿的比我還像新娘麻车。我一直安慰自己,他們只是感情好斗这,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布动猬。 她就那樣靜靜地躺著,像睡著了一般表箭。 火紅的嫁衣襯著肌膚如雪赁咙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音彼水,去河邊找鬼崔拥。 笑死,一個胖子當(dāng)著我的面吹牛凤覆,可吹牛的內(nèi)容都是我干的链瓦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盯桦,長吁一口氣:“原來是場噩夢啊……” “哼慈俯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拥峦,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤贴膘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后略号,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刑峡,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年玄柠,在試婚紗的時候發(fā)現(xiàn)自己被綠了突梦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡随闪,死狀恐怖阳似,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铐伴,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布俏讹,位于F島的核電站当宴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泽疆。R本人自食惡果不足惜户矢,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望殉疼。 院中可真熱鬧梯浪,春花似錦、人聲如沸瓢娜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眠砾。三九已至虏劲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柒巫。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工励堡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人堡掏。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓应结,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泉唁。 傳聞我的和親對象是個殘疾皇子鹅龄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)游两,斷路器砾层,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 本文出自 Eddy Wiki ,轉(zhuǎn)載請注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 2,115評論 0 14
  • Java多線程學(xué)習(xí) [-] 一擴展javalangThread類 二實現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,957評論 1 18
  • 處女座和上升處女座贱案,在整個9月份肛炮,可以用兩個字來形容:繁忙。在10月份會繼續(xù)這種模式宝踪,直到中下旬侨糟,已經(jīng)開始累的,再...
    星座論訊閱讀 304評論 0 0
  • 從未與你飲過冰 零度以下看風(fēng)景 01 有人說:女孩子是沒有愛情的,誰對她好厉膀,她就跟誰跑溶耘。 你認識我的時候我已經(jīng)是這...
    肀羽閱讀 679評論 0 2