开启生长之旅!这是我参加「日新方案 2 月更文挑战」的第 19 天,点击检查活动详情

前言

在咱们运用线程池操控线程运转时,或者是写爬虫时不断发送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:

Python控制线程或函数超时处理+实例代码展示

当咱们修改time.sleep为1小于2时,并没有超时,此时应该输出1、2:

import time
import eventlet#导入eventlet
eventlet.monkey_patch()#引入patch
with eventlet.Timeout(2,False):#设置超时时刻为2秒
    time.sleep(1)
    print('1')
print('2')

Python控制线程或函数超时处理+实例代码展示

当咱们想要调用子程序该函数是不起作用的。

像这样,该函数没有效果,这时候咱们需求运用第二种办法。

Python控制线程或函数超时处理+实例代码展示

二、func-timeout

1.装置

直接装置就好了

pip install func-timeout

或者直接在Github上面下载:GitHub-func-timeout

2.运用

一般是和tryexcept一起用,超时则扔出过错。

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:

Python控制线程或函数超时处理+实例代码展示

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.