python调用函数设置超时机制

有时候需要给函数设置超时机制,以防止它卡住我们的程序,这里可以用python的signal模块,signal模块可以实现程序内部的信号处理。

# coding:utf8
import time
import signal

# 自定义超时异常
class TimeoutError(Exception):
    def __init__(self, msg):
        super(TimeoutError, self).__init__()
        self.msg = msg

def time_out(interval, callback):
    def decorator(func):
        def handler(signum, frame):
            raise TimeoutError("run func timeout")

        def wrapper(*args, **kwargs):
            try:
                signal.signal(signal.SIGALRM, handler)
                signal.alarm(interval)       # interval秒后向进程发送SIGALRM信号
                result = func(*args, **kwargs)
                signal.alarm(0)              # 函数在规定时间执行完后关闭alarm闹钟
                return result
            except TimeoutError, e:
                callback(e)
        return wrapper
    return decorator

def timeout_callback(e):
    print(e.msg)

@time_out(2, timeout_callback)
def task1():
    print("task1 start")
    time.sleep(3)
    print("task1 end")

@time_out(2, timeout_callback)
def task2():
    print("task2 start")
    time.sleep(1)
    print("task2 end")

if __name__ == "__main__":
    task1()
    task2()

输出为:

>>> task1 start
>>> run func timeout
>>> task2 start
>>> task2 end

可以看到,虽然task1超时了,但是它不会影响我们程序的执行。

另外信号机制只能在主线程中生效, 意味着你不能在多线程中使用它,python已经很好的支持了协程,因此我们可以使用协程代替多线程。

原文地址:https://www.cnblogs.com/lucky-heng/p/10921980.html

时间: 2024-11-07 22:37:15

python调用函数设置超时机制的相关文章

python 调用函数

Python内置了很多有用的函数,我们可以直接调用. 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数.可以直接从Python的官方网站查看文档: http://docs.python.org/2/library/functions.html#abs 也可以在交互式命令行通过help(abs)查看abs函数的帮助信息. 调用abs函数: >>> abs(100) 100 >>> abs(-20) 20 >>> abs(1

给file_get_contents函数设置超时时间

$opts = array( 'http'=>array( 'method'=>"GET", 'timeout'=>60, ) ); $context = stream_context_create($opts); $html =file_get_contents('http://www.example.com', false, $context); 这样,file_get_contents获取数据时,超出60秒将会自动退出. 还可以利用file_get_conten

python 调用函数 / 类型转换 / 切片/ 迭代

调用函数 / 类型转换 /  切片/ 迭代 1. 调用函数:abs(),max(),min() 2. 数据类型转换:int(),float(),str(),tool(),a=abs, 3. 定义函数,如果没有return语句,函数执行完毕后也会返回结果,只是结果为None 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_abs函数为例: def my_ab

php中pcntl_alarm为函数设置超时限制【转】

来源:http://rango.swoole.com/archives/64原理是在函数执行前先设定一个时钟信号,如果函数的执行超过规定时间,信号会被触发,信号处理函数(sig)会抛出一个异常,被外层代码捕获.这样就跳出了原来函数的执行,接着执行下面的代码.如果函数在规定的时间内,时钟信号不会触发,在函数结束后清除时钟信号,不会有异常抛出 到php官方查看此函数说明 pcntl_alarm (PHP 4 >= 4.3.0, PHP 5) pcntl_alarm - 为进程设置一个alarm闹钟信

Python调用函数带括号和不带括号的区别

# -*- coding: utf-8 -*- #!/usr/bin/env python # @Time : 2019/4/18 10:02 # @Desc : # @File : test.py # @Software: PyCharm # @author : xushuang def bracket(data): return data if __name__ == '__main__': # 不带括号调用的结果:<function bracket at 0x0000000004DD0B3

python 调用函数步骤

我先随便定义一个类 class Abc(): pass a = Abc() a.func1() 显然会报错'Abc' object has no attribute 'func' 没有func这个属性, 但是我调用的是一个函数,应该说没有这个函数才对啊? 其实func1是一个属性,指向这个函数的地址,加上()后才等于调用这个函数. 原文地址:https://www.cnblogs.com/xuefyre/p/9479047.html

Unix网络编程 高级IO套接字设置超时

我们知道,对于一个套接字的读写(read/write)操作默认是阻塞的,如果当前套接字还不可读/写,那么这个操作会一直阻塞下去,这样对于一个需要高性能的服务器来说,是不能接受的.所以,我们可以在进行读写操作的时候可以指定超时值,这样就读写操作就不至于一直阻塞下去. 在涉及套接字的I/O操作上设置超时的方法有三种: 1:调用alarm,它在指定的超时期满时产生SIGALRM信号.这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用. 2:在select中阻

Android超时机制的处理(很不错)

由于手机端应用的响应,与当时的无线通信网络状况有很大的关联.而通信网络往往具有不稳定,延迟长的特点.所以,在我们的应用程序中,当我们请求网络的时候,超时机制的应用就显得特别重要. 超时机制主要有: 1.HTTP请求超时机制 2.Socket通信超时机制 HTTP请求超时机制 public static void main(String[] args){ long a=System.currentTimeMillis(); try{ URL myurl = new URL(“http://www.

浅谈getaddrinfo函数的超时处理机制

在sockproxy上发现,getaddrinfo 解析域名相比ping对域名的解析,慢很多.我觉得ping用了gethostbyname解析域名.问题变为getaddrinfo解析域名,是否比 gethostbyname慢.写测试程序,分别用getaddrinfo和gethostbyname解析,发现getaddrinfo确实慢. strace跟踪发现,getaddrinfo和DNS服务器通信10次,gethostbyname和DNS服务器通信2次. gethostbyname是古老的域名解析