Python控制線程和函數(shù)超時(shí)處理
前言
在我們使用線程池控制線程運(yùn)行時(shí),或者是寫(xiě)爬蟲(chóng)時(shí)不停發(fā)送request獲取地址,都需要我們對(duì)運(yùn)行的線程加以控制。有這樣一種場(chǎng)景,當(dāng)你寫(xiě)入一條網(wǎng)站請(qǐng)求時(shí),該線程一直請(qǐng)求并沒(méi)有回應(yīng)導(dǎo)致線程造成堵塞,浪費(fèi)珍貴的線程資源。當(dāng)你寫(xiě)入一條錯(cuò)誤的sql查詢語(yǔ)句時(shí),該查詢語(yǔ)句一直運(yùn)行需要花費(fèi)大量時(shí)間,導(dǎo)致其他查詢語(yǔ)句阻塞。遇到如上述情況必須對(duì)線程加以控制,才能使得程序腳本穩(wěn)定性更高。
控制線程運(yùn)行時(shí)間方法有多種:
這里介紹兩種方法,一種是用eventlet庫(kù)的方法進(jìn)行,該方法只要進(jìn)行了子程序調(diào)用就失效了。另一種方法是使用@func_set_timeout修飾器,該方法可作用于函數(shù)、線程等一系列子函數(shù),是最方便最簡(jiǎn)單高效的方法。這里來(lái)進(jìn)行代碼操作演示這兩種方法。
一、Eventlet
該庫(kù)可以直接下載:
pip install eventlet import time import eventlet#導(dǎo)入eventlet eventlet.monkey_patch()#引入patch with eventlet.Timeout(2,False):#設(shè)置超時(shí)時(shí)間為2秒 ? ? time.sleep(3) ? ? print('1') print('2')
我們?cè)O(shè)定睡眠時(shí)間為3秒,超過(guò)了2秒,這樣會(huì)導(dǎo)致print('1')這條語(yǔ)句執(zhí)行跳過(guò),直接輸出2:
import time import eventlet#導(dǎo)入eventlet eventlet.monkey_patch()#引入patch with eventlet.Timeout(2,False):#設(shè)置超時(shí)時(shí)間為2秒 ? ? time.sleep(1) ? ? print('1') print('2')
當(dāng)我們修改time.sleep為1小于2時(shí),并沒(méi)有超時(shí),此時(shí)應(yīng)該輸出1、2:
當(dāng)我們想要調(diào)用子程序該函數(shù)是不起作用的。像這樣,該函數(shù)沒(méi)有效果,這時(shí)候我們需要使用第二種方法。
二、func-timeout
1.安裝
直接安裝就好了
pip install func-timeout
2.使用
一般是和try except一起用,超時(shí)則扔出錯(cuò)誤。
from func_timeout import func_set_timeout import func_timeout @func_set_timeout(1)#設(shè)定函數(shù)超時(shí)執(zhí)行時(shí)間 def task(i): ? ? time.sleep(2) ? ? print(i) try: ? ? task(1) except: ? ? print(2)
這時(shí)候sleep時(shí)間超過(guò)1應(yīng)該輸出2:
from func_timeout import func_set_timeout import func_timeout @func_set_timeout(3)#設(shè)定函數(shù)超時(shí)執(zhí)行時(shí)間 def task(i): ? ? time.sleep(2) ? ? print(i) try: ? ? task(1) except: ? ? print(2)
這樣就輸出為1.
到此這篇關(guān)于Python控制線程和函數(shù)超時(shí)處理的文章就介紹到這了,更多相關(guān)Python控制線程 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python編寫(xiě)簡(jiǎn)單的畫(huà)圖板程序的示例教程
這篇文章主要介紹了使用Python編寫(xiě)簡(jiǎn)單的畫(huà)圖板軟件的示例教程,利用到了經(jīng)常被用來(lái)做游戲的pygame模塊,需要的朋友可以參考下2015-12-12學(xué)會(huì)python自動(dòng)收發(fā)郵件 代替你問(wèn)候女友
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)自動(dòng)收發(fā)郵件,代替你問(wèn)候女友,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05python3 property裝飾器實(shí)現(xiàn)原理與用法示例
這篇文章主要介紹了python3 property裝飾器實(shí)現(xiàn)原理與用法,結(jié)合實(shí)例形式分析了Python3 property裝飾器功能、原理及實(shí)現(xiàn)方法,需要的朋友可以參考下2019-05-05Python網(wǎng)絡(luò)編程中urllib2模塊的用法總結(jié)
使用urllib2模塊進(jìn)行基于url的HTTP請(qǐng)求等操作大家也許都比較熟悉,這里我們?cè)偕钊雭?lái)了解一下urllib2針對(duì)HTTP的異常處理相關(guān)功能,一起來(lái)看一下Python網(wǎng)絡(luò)編程中urllib2模塊的用法總結(jié):2016-07-07python使用opencv對(duì)圖像添加噪聲(高斯/椒鹽/泊松/斑點(diǎn))
這篇文章主要介紹了python使用opencv對(duì)圖像添加噪聲(高斯/椒鹽/泊松/斑點(diǎn)),具有一定的學(xué)習(xí)價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你有所幫助2022-04-04python和numpy?matplotlib版本匹配及安裝指定版本庫(kù)
Matplotlib 是 Python 的繪圖庫(kù),它經(jīng)常與NumPy一起使用,從而提供一種能夠代替Matlab的方案,這篇文章主要給大家介紹了關(guān)于python和numpy?matplotlib版本匹配及安裝指定版本庫(kù)的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10python中字典(Dictionary)用法實(shí)例詳解
這篇文章主要介紹了python中字典(Dictionary)用法,以實(shí)例形式較為詳細(xì)的分析了Python字典建立、添加、刪除等常見(jiàn)操作技巧,需要的朋友可以參考下2015-05-05