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!

推薦閱讀: