ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python利用signal自定义函数超时机制

2021-12-09 13:35:32  阅读:190  来源: 互联网

标签:task1 task2 自定义 python signal time 超时 def


利用signal模块,可以给函数设置一个超时时间(精确到秒),结合装饰器实现:超时时间内函数运行完成正常退出,超时时间内函数未运行完成则抛出Timeout异常。

 1 # coding:utf8
 2 import time
 3 import signal
 4 
 5 
 6 # 自定义超时异常
 7 class TimeoutError(Exception): pass
 8 
 9 # 超过超时时间,调用此函数
10 def handler(signum, frame):
11     raise TimeoutError()
12 
13 # 函数超时装饰器
14 def time_out(interval, doc):
15     def decorator(func):
16         def wrapper(*args, **kwargs):
17             try:
18                 signal.signal(signal.SIGALRM, handler)
19                 signal.alarm(interval)       # interval秒后向进程发送SIGALRM信号
20                 result = func(*args, **kwargs)
21                 signal.alarm(0)              # 函数在规定时间执行完后关闭alarm闹钟
22                 return result
23             except TimeoutError as e:
24                 # 捕获到超时异常,要做的事情
25                 print("The function failed to run due to timeout, func:<%s>" % doc)
26         return wrapper
27     return decorator
28 
29 @time_out(1, "demo.py中task1函数")
30 def task1():
31     print("task1 start")
32     time.sleep(1.2)
33     print("task1 end")
34 
35 
36 @time_out(1, "demo.py中task2函数")
37 def task2():
38     print("task2 start")
39     time.sleep(0.8)
40     print("task2 end")
41 
42 
43 if __name__ == "__main__":
44     task1()
45     task2()
46 
47 
48 # task1 start
49 # The function failed to run due to timeout, func:<demo.py中task1函数>
50 # task2 start
51 # task2 end

 

标签:task1,task2,自定义,python,signal,time,超时,def
来源: https://www.cnblogs.com/zzmx0/p/15666681.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有