Python控制線程和函數超時處理
前言
在我們使用線程池控制線程運行時,或者是寫爬蟲時不停發送request獲取地址,都需要我們對運行的線程加以控制。有這樣一種場景,當你寫入一條網站請求時,該線程一直請求並沒有回應導致線程造成堵塞,浪費珍貴的線程資源。當你寫入一條錯誤的sql查詢語句時,該查詢語句一直運行需要花費大量時間,導致其他查詢語句阻塞。遇到如上述情況必須對線程加以控制,才能使得程序腳本穩定性更高。
控制線程運行時間方法有多種:
這裡介紹兩種方法,一種是用eventlet庫的方法進行,該方法隻要進行瞭子程序調用就失效瞭。另一種方法是使用@func_set_timeout修飾器,該方法可作用於函數、線程等一系列子函數,是最方便最簡單高效的方法。這裡來進行代碼操作演示這兩種方法。
一、Eventlet
該庫可以直接下載:
pip install eventlet import time import eventlet#導入eventlet eventlet.monkey_patch()#引入patch with eventlet.Timeout(2,False):#設置超時時間為2秒 time.sleep(3) print('1') print('2')
我們設定睡眠時間為3秒,超過瞭2秒,這樣會導致print('1')這條語句執行跳過,直接輸出2:
import time import eventlet#導入eventlet eventlet.monkey_patch()#引入patch with eventlet.Timeout(2,False):#設置超時時間為2秒 time.sleep(1) print('1') print('2')
當我們修改time.sleep為1小於2時,並沒有超時,此時應該輸出1、2:
當我們想要調用子程序該函數是不起作用的。
像這樣,該函數沒有效果,這時候我們需要使用第二種方法。
二、func-timeout
1.安裝
直接安裝就好瞭
pip install func-timeout
2.使用
一般是和try except一起用,超時則扔出錯誤。
from func_timeout import func_set_timeout import func_timeout @func_set_timeout(1)#設定函數超時執行時間 def task(i): time.sleep(2) print(i) try: task(1) except: print(2)
這時候sleep時間超過1應該輸出2:
from func_timeout import func_set_timeout import func_timeout @func_set_timeout(3)#設定函數超時執行時間 def task(i): time.sleep(2) print(i) try: task(1) except: print(2)
這樣就輸出為1.
到此這篇關於Python控制線程和函數超時處理的文章就介紹到這瞭,更多相關Python控制線程 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!