基于linux信号的timeout装饰器
在做基于ray的分布式任务处理时,偶尔遇到由于ray集群不稳定导致的长时间连接不上,进而导致程序卡死,无法向后端返回任务状态的情况。但是ray的初始化函数本身未实现超时机制,因此设计基于多线程+信号的timeout装饰器,当连接超时时,向后端返回异常状态。
这里之所以要起新线程去初始化ray,是为了保证主线程可以随时处理sigalrm信号,因为linux信号是一种软中断,linux内核的信号处理时机是在程序由内核态切换为用户态时,如果被监控程序未发生内核态到用户态的切换,那么即使内核向进程发出了信号,信号也只会入队,不会触发信号处理函数的执行。
import ray
import threading
import signal def timeout(seconds=5, hint=''):
def handler(signo, frame):
raise Exeption('{}执行超时! time out={}'.format(hint, seconds)
def wrap(func):
def dec(*args, **kwargs):
signal.signal(signal.SIGALRM, handler)
signal.alarm(seconds)
res = func(*args, **kwargs)
signal.alarm(0)
return res
return dec
return wrap @timeout(3, '初始化计算资源')
def init_calculation_resources():
kwargs = {...}
t = threading.Thread(target=ray.init, kwargs=(kwargs))
t.start()
t.join()
linux对信号的处理机制:
信号号称所谓软中断,事实上,还是没有真正的硬件中断那样能随时改变cpu的执行流,
硬件中断之所以能一发生就得到处理是因为处理器在每个指令周期的结尾都会去检查中断,这种粒度是很细的,
但是信号的实现只是在进程的task_struct里面有一个成员用于标识当前收到了哪些信号?
而这个成员的检查显然只能在特定时间点:从内核模式返回到用户模式的时候
可以想象,当进程从一个硬件中断中返回、从系统调用中返回或者正在休眠或者刚刚得到了调度,都是从内核态返回用户态的时机
这时候就会检查pending signals,注意信号处理函数的调用也看成是在内核态的,也就是如果累计了多个信号会一直处理完才返回用户态。
所以永远不要指望你所发送的信号能像硬件中断那般随时处理!
基于linux信号的timeout装饰器的更多相关文章
- pyqt5界面与逻辑分离--信号槽的装饰器实现方式
本文展示了 pyqt5 信号槽的装饰器实现方式(借鉴自 eirc6) 一个简单的例子.实现功能:两个数相加,显示结果.如图 两个文件,第一个是界面文件 ui_calc.py # ui_calc.py ...
- ts装饰器的用法,基于express创建Controller等装饰器
TS TypeScript 是一种由微软开发的自由和开源的编程语言.它是 JavaScript 的一个超集,而且本质上向这个语言添加了可选的静态类 型和基于类的面向对象编程. TypeScript 扩 ...
- 基于django封装的常用装饰器和函数
1:返回操作成功的json数据 def response_success(message, data=None, data_list=[]): return HttpResponse(json.dum ...
- 两个实用的Python的装饰器
两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...
- Python入门-面向对象-装饰器
1.变量作用域 全局变量和局部变量 #变量是有作用域的,分为全局变量和局部变量 num = 100 #这是全局变量 def change(): """ 查看变量作用域 & ...
- 第一次作业:基于Linux 4.5的进程模型与调度器分析
1.操作系统是怎么组织进程的? 1.1什么是线程,什么是进程: 刚接触时可能经常会将这两个东西搞混.简单一点的说,进程是一个大工程,线程则是这个大工程中每个小地方需要做的东西(在linux下看作&qu ...
- 基于TypeScript装饰器定义Express RESTful 服务
前言 本文主要讲解如何使用TypeScript装饰器定义Express路由.文中出现的代码经过简化不能直接运行,完整代码的请戳:https://github.com/WinfredWang/expre ...
- (26)基于cookie的登陆认证(写入cookie、删除cookie、登陆后所有域下的网页都可访问、登陆成功跳转至用户开始访问的页面、使用装饰器完成所有页面的登陆认证)
获取cookie request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age ...
- django之基于cookie和装饰器实现用户认证
示例1 # Create your views here. user = "a" pwd = "a" def login(request): if reques ...
随机推荐
- 2019 GDUT Rating Contest II : Problem G. Snow Boots
题面: G. Snow Boots Input file: standard input Output file: standard output Time limit: 1 second Memory ...
- 1、Spring教程之Spring概述
1.Spring概述 简介 Spring : 春天 --->给软件行业带来了春天 2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架. 2004年3月24 ...
- Android Studio 待看博文
•前言 学习过程中找到的一些好的博文,有些可能当时就看完了并解决了我的问题,有些可能需要好几天的事件才能消化. 特此记录,方便查阅. •CSDN 给新人的一些基础常识 TextView的文字长度测量及 ...
- SpringBoot-11 扩展功能
SpringBoot-11 扩展功能 异步 同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列.要么成功都成功,失败都失败,两个任务 ...
- 详解CURL状态码,最全的代码列表
curl是一个强大的命令,其中我们经常使用的通过curl 加地址和端口号,判断目标链接状态,下面列出了curl 返回的状态码. 举例: [root@k8s-master1 ~]# curl k8s-m ...
- 高精度加法(c++)
为什么要用高精度? 有时我们要进行精度较高的运算时,就要使用高精度来进行运算: 就如例题: 大整数加法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 21965 通过数: 634 ...
- [Fundamental of Power Electronics]-PART I-6.变换器电路-6.4 变换器评估与设计/6.5 重点与小结
6.4 变换器评估与设计 没有完美适用于所有可能应用场合的统一变换器.对于给定的应用和规格,应该进行折中设计来选择变换器的拓扑.应该考虑几种符合规格的拓扑,对于每种拓扑方法,对比较重要的量进行计算,比 ...
- spring-cloud-consul 服务注册发现与配置
下面是 Spring Cloud 支持的服务发现软件以及特性对比(Eureka 已停止更新,取而代之的是 Consul): Feature euerka Consul zookeeper etcd 服 ...
- Leedcode算法专题训练(字符串)
4. 两个字符串包含的字符是否完全相同 242. Valid Anagram (Easy) Leetcode / 力扣 可以用 HashMap 来映射字符与出现次数,然后比较两个字符串出现的字符数量是 ...
- try - with - resource
本文详细介绍了自 JDK 7 引入的 try-with-resources 语句的原理和用法,以及介绍了 JDK 9 对 try-with-resources 的改进,使得用户可以更加方便.简洁的使用 ...