Python控制线程和函数超时处理

目录
  • 前言
  • 一、Eventlet
  • 二、func-timeout
    • 1.安装
    • 2.使用

前言

在我们使用线程池控制线程运行时,或者是写爬虫时不停发送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控制线程 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python函数超时自动退出的实操方法

    本章给大家在项目使用时候,常见的一种情况解决案例,即是当我们调用多个线程,使用了同一个函数去处理数据的时候,有些用函数已经处理完成,但是有些还没有,这就需要我们将任务进行分割,然后当一小部分任务执行后,退出来,另外没有执行的完成超时的就继续去执行,下面就针对遇到这些问题的小伙伴,给大家提供解决参考. 安装timeout-decorator库: pip3 install timeout-decorator 编写异常语句: @timeout_decorator.timeout(5, timeout_

  • python多线程同步之文件读写控制

    本文实例为大家分享了python多线程同步之文件读写控制的具体代码,供大家参考,具体内容如下 1.实现文件读写的文件ltz_schedule_times.py #! /usr/bin/env python #coding=utf-8 import os def ReadTimes(): res = [] if os.path.exists('schedule_times.txt'): fp = open('schedule_times.txt', 'r') else: os.system('to

  • python如何控制进程或者线程的个数

    背景 日常开发中,难免遇到并发场景,而并发场景难免需要做流量控制,即需要对并发的进程或者线程的总量进行控制. 今天简单总结两种常用的控制线程个数的方法. 方法一:进程池/线程池 如下例demo所示, 创建了一个大小是4的进程池,然后创建5个进程,并启动 from multiprocessing import Pool import os, time, random def long_time_task(name): print('Run task %s (%s)...' % (name, os.

  • 在 Linux/Mac 下为Python函数添加超时时间的方法

    我们在使用 requests 这类网络请求第三方库时,可以看到它有一个参数叫做 timeout ,就是指在网络请求发出开始计算,如果超过 timeout 还没有收到返回,就抛出超时异常.(当然存在特殊情况timeout 会失效,请看Timeouts and cancellation for humans* 这篇文章中作者的举例,我们不考虑这种特殊情况). 但大家有没有考虑过,如何为普通的函数设置超时时间?特别是在运行一些数据处理.AI 相关的代码时,某个函数可能会运行很长时间,我们想实现,在函数

  • python子线程退出及线程退出控制的代码

    下面通过代码给大家介绍python子线程退出问题,具体内容如下所示: def thread_func(): while True: #do something #do something #do something t=threading.Thread(target = thread_func) t.start() # main thread do something # main thread do something # main thread do something 跑起来是没有问题的,

  • 解决Python设置函数调用超时,进程卡住的问题

    背景: 最近写的Python代码不知为何,总是执行到一半卡住不动,为了使程序能够继续运行,设置了函数调用超时机制. 代码: import time import signal def test(i): time.sleep(i % 4) print "%d within time" % (i) return i if __name__ == '__main__': def handler(signum, frame): raise AssertionError for i in ran

  • Python装饰器限制函数运行时间超时则退出执行

    实际项目中会涉及到需要对有些函数的响应时间做一些限制,如果超时就退出函数的执行,停止等待. 可以利用python中的装饰器实现对函数执行时间的控制. python装饰器简单来说可以在不改变某个函数内部实现和原来调用方式的前提下对该函数增加一些附件的功能,提供了对该函数功能的扩展. 方法一. 使用 signal # coding=utf-8 import signal import time def set_timeout(num, callback): def wrap(func): def h

  • Python控制线程和函数超时处理

    目录 前言 一.Eventlet 二.func-timeout 1.安装 2.使用 前言 在我们使用线程池控制线程运行时,或者是写爬虫时不停发送request获取地址,都需要我们对运行的线程加以控制.有这样一种场景,当你写入一条网站请求时,该线程一直请求并没有回应导致线程造成堵塞,浪费珍贵的线程资源.当你写入一条错误的sql查询语句时,该查询语句一直运行需要花费大量时间,导致其他查询语句阻塞.遇到如上述情况必须对线程加以控制,才能使得程序脚本稳定性更高. 控制线程运行时间方法有多种: 这里介绍两

  • Python开启线程,在函数中开线程的实例

    逻辑处理上分成了多个模块,为了提高效率,前一个模块处理完调用后一个模块操作时使用多线程 我这里遇到的情形是前面取数据后面存到mysql,发现单线程效率很低,改为取数据后开线程存到mysql 开启线程之后性能提升一倍,同时用信号量做线程同步,控制数据库同时连接数 这里只是简单的一个demo,主要是开线程的处理方式,在自己类里面的函数中开启线程,并用自己类的成员函数做线程运行函数. #coding=utf-8 import threading class Test: __init = 1 def _

  • python使用装饰器和线程限制函数执行时间的方法

    本文实例讲述了python使用装饰器和线程限制函数执行时间的方法.分享给大家供大家参考.具体分析如下: 很多时候函数内部包含了一些不可预知的事情,比如调用其它软件,从网络抓取信息,可能某个函数会卡在某个地方不动态,这段代码可以用来限制函数的执行时间,只需要在函数的上方添加一个装饰器,timelimited(2)就可以限定函数必须在2秒内执行完成,如果执行完成则返回函数正常的返回值,如果执行超时则会抛出错误信息. # -*- coding: utf-8 -*- from threading imp

  • python自定义线程池控制线程数量的示例

    1.自定义线程池 import threading import Queue import time queue = Queue.Queue() def put_data_in_queue(): for i in xrange(10): queue.put(i) class MyThread(threading.Thread): def run(self): while not queue.empty(): sleep_times = queue.get() time.sleep(sleep_t

  • Python控制多进程与多线程并发数总结

    一.前言 本来写了脚本用于暴力破解密码,可是1秒钟尝试一个密码2220000个密码我的天,想用多线程可是只会一个for全开,难道开2220000个线程吗?只好学习控制线程数了,官方文档不好看,觉得结构不够清晰,网上找很多文章也都不很清晰,只有for全开线程,没有控制线程数的具体说明,最终终于根据多篇文章和官方文档算是搞明白基础的多线程怎么实现法了,怕长时间不用又忘记,找着麻烦就贴这了,跟我一样新手也可以参照参照. 先说进程和线程的区别: 地址空间:进程内的一个执行单元;进程至少有一个线程;它们共

  • Python实现线程状态监测简单示例

    本文实例讲述了Python实现线程状态监测.分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- from threading import Thread import time def func1(): time.sleep(10) t1=Thread(target=func1) print('t1:',t1.isAlive()) t1.start() print('t1:',t1.isAlive()) t1.join(5) print('t1:',t1.isAliv

  • Python Threading 线程/互斥锁/死锁/GIL锁

    导入线程包 import threading 准备函数线程,传参数 t1 = threading.Thread(target=func,args=(args,)) 类继承线程,创建线程对象 class MyThread(threading.Thread) def run(self): pass if __name__ == "__main__": t = MyThread() t.start() 线程共享全面变量,但在共享全局变量时会出现数据错误问题 使用 threading 模块中的

  • Python测试线程应用程序过程解析

    这篇文章主要介绍了Python测试线程应用程序过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在本章中,我们将学习线程应用程序的测试.我们还将了解测试的重要性. 为什么要测试? 在我们深入讨论测试的重要性之前,我们需要知道测试的内容.一般来说,测试是一种了解某些东西是如何运作的技术.另一方面,特别是如果我们谈论计算机程序或软件,那么测试就是访问软件程序功能的技术. 在本节中,我们将讨论软件测试的重要性.在软件开发中,必须在向客户端发布软

随机推荐