利用Python多线程限制 http 真实请求时间或限制函数最大执行时间的装饰器

本文介绍了一种解决Python爬虫请求超时问题的方法。通过使用多线程和装饰器技术,有效地控制了请求时间,避免了单个请求超时导致整体效率降低的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  这段时间在制作一个爬虫的时候发现了一个比较神奇的事情 python requests 包发起请求的时候设置 timeout 参数 竟然不起作用?

what 你要弄啥幺蛾子嘞,  后来各种找原因终于在别人的提醒下又看了下 requests 的文档才发现原来 timeout 设置超时只是指发起到对方服务器接受到请求这段时间,原文:timeout 仅对连接过程有效,与响应体的下载无关。 timeout 并不是整个下载响应的时间限制,而是如果服务器在 timeout 秒内没有应答,将会引发一个异常(更精确地说,是在timeout 秒内没有从基础套接字上接收到任何字节的数据时)If no timeout is specified explicitly, requests do not time out.

没办法,因为业务需要必须要严格控制响应时间只好利用 python 的多线程来制作了一个异步的限制函数执行时间的装饰器:

import requests,datetime,time
import threading

class MyThread(threading.Thread):
    def __init__(self,target,args=()):
        """
        why: 因为threading类没有返回值,因此在此处重新定义MyThread类,使线程拥有返回值
        此方法来源 https://www.cnblogs.com/hujq1029/p/7219163.html?utm_source=itdadao&utm_medium=referral
        """
        super(MyThread,self).__init__()
        self.func = target
        self.args = args
    def run(self):
        #接受返回值
        self.result = self.func(*self.args)

    def get_result(self):
        #线程不结束,返回值为None
        try:
            return self.result
        except Exception:
            return None

#为了限制真实请求时间或函数执行时间的装饰器
def limit_decor(limit_time):
    """
    :param limit_time: 设置最大允许执行时长,单位:秒
    :return: 未超时返回被装饰函数返回值,超时则返回 None
    """
    def functions(func):
        #执行操作
        def run(*params):
            thre_func = MyThread(target=func,args=params)
            #主线程结束(超出时长),则线程方法结束
            thre_func.setDaemon(True)
            thre_func.start()
            #计算分段沉睡次数
            sleep_num = int(limit_time // 1)
            sleep_nums = round(limit_time % 1, 1)
            #多次短暂沉睡并尝试获取返回值
            for i in range(sleep_num):
                time.sleep(1)
                infor = thre_func.get_result()
                if infor:
                    return infor
            time.sleep(sleep_nums)
            #最终返回值(不论线程是否已结束)
            return thre_func.get_result()
        return run
    return functions

总之把这个装饰器对公司的部分代码进行了下优化, 效果是非常非常不错的。再也没有出现因单个爬虫请求超时而导致整个代码执行时间而延长的情况出现。

 

本文原创,如需转载请注明来源。

注 : 网络爬虫要尽量减小对被爬取网站影响, 如在被爬取网站每天访问量较小的时间段去爬取,一切为了和平发展。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值