Python中线程Timeout的使用
Python中关于Timeout有另一种用起来更简便的方法,即使用装饰器。这种方式是使用sys模块的settrace等方法重构了python的threading类:
#!/usr/bin/python
import threading
import sys
class KThread(threading.Thread):"""Subclass of threading.Thread, with a kill() method."""def __init__(self, *args, **kwargs):threading.Thread.__init__(self, *args, **kwargs)self.killed = Falsedef start(self):"""Start the thread."""self.__run_backup = self.run"""Force the Thread to install our trace."""self.run = self.__runthreading.Thread.start(self)def __run(self):"""Hacked run function, which installs the trace."""sys.settrace(self.globaltrace)self.__run_backup()self.run = self.__run_backupdef globaltrace(self, frame, why, arg):if why == 'call':return self.localtraceelse:return Nonedef localtrace(self, frame, why, arg):if self.killed:if why == 'line':raise SystemExit()return self.localtracedef kill(self):self.killed = True
然后,构造一个timeout装饰器,这个装饰器利用上面重载的KThread实现超时限制:
def timeout(seconds):def timeout_decorator(func):def _new_func(oldfunc, result, oldfunc_args, oldfunc_kwargs):result.append(oldfunc(*oldfunc_args, **oldfunc_kwargs))def _(*args, **kwargs):result = []'''create new args for _new_funcbecausewe want to get the func return val to result list'''new_kwargs = {'oldfunc': func,'result': result,'oldfunc_args': args,'oldfunc_kwargs': kwargs}thd = KThread(target=_new_func, args=(), kwargs=new_kwargs)thd.start()thd.join(seconds)alive = thd.isAlive()'''kill the child thread'''thd.kill()if alive:alert_exce = u'function timeout for [%d s].' % secondsraise Timeout(alert_exce)else:return result[0]_.__name__ = func.__name___.__doc__ = func.__doc__return _return timeout_decorator
这种方法使用起来十分简单:只需要在需要超时控制的函数前面使用@timeout(sec)装饰器即可。
但是这种方法有比较明显的缺陷,因为其本质是使用将函数使用重载的线程来控制,一旦被添加装饰器的函数内部使用了线程或者子进程等复杂的结构,而这些线程和子进程其实是无法获得超时控制的,所以可能导致外层的超时控制无效。
转载于:https://blog.51cto.com/ctoivan/1378292
相关文章:
Vue的模板语法学习
模板语法 1、插值 a、文本 数据绑定最常见的形式就是使用 “Mustache” 语法(双大括号)的文本插值 我们在普通插值的时候无论何时,绑定的数据对象上 msg 属性发生了改变,插值处的内容都会更新 【案例】 <div id"app"…

求二维数组中最大子数组的和
任国庆 张博 之前我们讨论了在一维数组中求最大子数组的和,在此基础上我们开始讨论二维数组的最大子数组。 求二维数组的最大子数组思想是建立在以为数组。首先将数组的第一列看成一个一维数组,找到该列的最大子数组的值,然后将第二列与第一…

赠书 | 详解 4 种爬虫技术
作者 | 赵国生 王健来源 | 大数据DT头图 | 下载于视觉中国前言:聚焦网络爬虫是“面向特定主题需求”的一种爬虫程序,而通用网络爬虫则是捜索引擎抓取系统(Baidu、Google、Yahoo等)的重要组成部分,主要目的是将互联网上…

nginx 通过proxy_next_upstream实现容灾和重复处理问题
proxy_next_upstream指令语法: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 |http_504 |http_404 | off ...; 默认值: proxy_next_upstream error timeout; 上下文: http, server, locationerror # 和后端服务器建立连接时&…

javascript身份证号码验证函数支持带x
//--身份证号码验证-支持新的带x身份证functionisIdCardNo(num) { varfactorArr newArray(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1); varerror; varvarArray newArray(); varintValue; varlngProduct 0; varintCheckDigit; varintStrLen num.length; v…

「AI 质检员」在富士通上岗,效率比人工高 25%
日本第一 IT 厂商富士通,于近日宣布开发了用于检测产品外观异常的 AI 技术,从而节省人力成本、材料成本等,同时也可节省声誉损失和退货/召回相关的成本,「无人工厂」已来。来源 | Hyper超神经责编 | 寇雪芹头图 | 下载于视觉中国去…

asp在线压缩和解压缩文件(文件夹)
asp在线压缩和解压缩文件(文件夹) <%\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 1. c:\windows\system32\cmd.exe\\ 拷贝把本文件所在的路径\\\\ 2. 把 c:\program\winrar\rar.exe\\ 拷贝把本文件所在的路径 并改名为WinRAR.e…

SpringMVC + Hibernate-Validator 参数校验
2019独角兽企业重金招聘Python工程师标准>>> 前言: Web开发中,最为常见的场景就是前端表单数据、Json数据与后端实体类的绑定,即使JS能校验并阻止大部分的必填漏填的风险,但并不能防止恶意破坏者修改脚本。因此后端参数…

深入浅出,机器学习该怎么入门?
来源 | 算法进阶责编 | 寇雪芹头图 | 下载于视觉中国前言:机器学习作为人工智能领域的核心组成,是计算机程序学习数据经验以优化自身算法,并产生相应的“智能化的”建议与决策的过程。一个经典的机器学习的定义是:A computer prog…

防止SQL注入式攻击
1将sql中使用的一些特殊符号,如 -- /* ; %等用Replace()过滤;2限制文本框输入字符的长度;3检查用户输入的合法性;客户端与服务器端都要执行,可以使用正则。4使用带参数的SQL语句形式。 尽量用存储过程

js中document.write的那点事
document.write()方法可以用在两个方面:页面载入过程中用实时脚本创建页面内容,以及用延时脚本创建本窗口或新窗口的内容。该方法需要一个字符串参数,它是写到窗口或框架中的HTML内容。这些字符串参数可以是变量或值为字符串的表达式…

SVN提示被锁定的解决方法(转)
1、(常用)出现这个问题后使用“清理”即"Clean up"功能,如果还不行,就直接到上一级目录,再执行“清理”,然后再“更新”。 2、(没试过)有时候如果看到某个包里面的文件夹没…

征集佳句-精妙SQL语句收集
征集佳句-精妙SQL语句收集 SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作,方便自己写SQL时方便一点,想贴上来,一起看看,同时希望大家能共同多多提意见,也给我…

【WP8】ResourceDictionary
WP8中引用资源字典 当我们定义的样式太多的时候,我们可以把样式分别定义在不同的文件中,然后通过 MergedDictionaries 应用到其他资源字典中,看下面Demo 我们可以把样式定义在多个文件中,然后再App.xaml中引用 我们先定义三个文件…

拿来就能用! CTO 创业技术栈指南!
作者 | Nitin Aggarwal译者 | 弯月出品 | CSDN(ID:CSDNnews)随着开发运维概念的诞生,以及“You build it, you run it.”(谁构建,谁运维)理念的盛行,现代创业公司的技术栈也发生了许…

Go处理百万每分钟的请求
2019独角兽企业重金招聘Python工程师标准>>> I have been working in the anti-spam, anti-virus and anti-malware industry for over 15 years at a few different companies, and now I know how complex these systems could end up being due to the massive a…

data pump工具
expdp和impdp的用法ORCALE10G提供了新的导入导出工具,数据泵。Oracle官方对此的形容是:OracleDataPump technology enables Very High-Speed movement of data and metadata from one database to another.其中Very High-Speed是亮点。先说数据泵提供的主…

游标对于分页存储过程
1。我个人认为最好的分页方法是: Select top 10 * from table where id>200写成存储过程,上面的语句要拼一下sql语句,要获得最后大于的哪一个ID号 2。那个用游标的方式,只适合于小数据量的表,如果表在一万行以上,就差劲了 你的存储过程还比不上NOT IN分页,示例: SELECT …

混沌、无序、变局?探索之中,《拟合》开启
从无序中寻找踪迹,从眼前事探索未来在东方的神话里,喜鹊会搭桥,银河是条河,两端闪耀的牵牛星和织女星,则是一年一相会的佳偶,他们彼此间的惦念,会牵引彼此在七夕那天实现双星聚首。在西方的世界…

linxu 下安装mysql5.7.19
2019独角兽企业重金招聘Python工程师标准>>> 1、首先检查是否已经安装过mysql,查找mysql相关软件rpm包 # rpm -qa | grep mysql 2、将所有与mysql相关的东西删除 #yum -y remove mysql-libs-5.1.66-2.el6_3.x86_64 3、安装依赖包 #yum -y install make gcc-c cmake …

C#技术内幕 学习笔记
引用类型是类型安全的指针,它们的内存是分配在堆(保存指针地址)上的。String、数组、类、接口和委托都是引用类型。 强制类型转换与as类型转换的区别:当类型转换非法时,强制类型转换将抛出一个System.InvalidCastExce…
java的深度克隆
原文:http://blog.csdn.net/randyjiawenjie/article/details/7563323javaobjectinterfacestringclassexception先做个标记 http://www.iteye.com/topic/182772 http://www.blogjava.net/jerry-zhaoj/archive/2009/10/14/298141.html 关于super.clone的理解 http://h…

持续推进预估时间问题研究,滴滴盖亚计划开放ETA数据集
4月29日消息,为持续推进行程时长预估问题研究,滴滴联合GIS(地理信息系统)领域国际顶会ACM SIGSPATIAL发布ACM SIGSPATIAL GISCUP 2021比赛,鼓励研究者们基于滴滴新开放的行程时长数据集,进一步提升时间预估准确性。 预估到达时间…

3.Java集合-HashSet实现原理及源码分析
一、HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持,它不保证set的迭代顺序很久不变。此类允许使用null元素 二、HashSet的实现: 对于HashSet而言,它是基于HashMap实现…

一个函数返回多个值
有两种方法:1.使用指针变量声明函数(或者使用数组变量)2.使用传出参数 第一种方法:函数返回的是一个指针地址(数组地址),这个内存地址有多个变量寄存在里面。这个方法我不太会用,传…

4月30日或为上半年“最难打车日”
滴滴出行昨日发布预测,称由于周五通勤晚高峰及假期启程高峰叠加,4月30日下午或将成为今年上半年“最难打车日”,用户将遇到叫车排队甚至打不到车的情况。滴滴呼吁,请提前规划行程,预留充足时间,大家五一快乐…

exchange 2003配置ASSP 反垃圾邮件
Exchange上第三方反垃圾邮件用得比较多的是ORF,它直接运行在虚拟SMTP服务上,配置非常的方便。ASSP(https://sourceforge.net/projects/assp/) 是一个开源的反垃圾邮件代理,反垃圾效果也非常好,这里不讲如何…

中国人工智能学会通讯——人工智能在各医学亚专科的发展现状及趋势 1.3 人工智能在各医学亚专科的发展态势...
1.3 人工智能在各医学亚专科的发展态势 1. 人工智能在眼科领域的应用 2016年11月,Google的研究者Gulshan博士等人在美国医学协会杂志“Journal of the American Medical Association”上发表的一篇文章,运用deep learning算法(卷积神经网络&a…

在ASP.NET中如何用C#.NET实现基于表单的验证
这篇文章引用到了Microsoft .NET类库中的以下名空间: System.Data.SqlClient System.Web.Security ------------ÿ…

PHP学习笔记 第八讲 Mysql.简介和创建新的数据库
八、Mysql.简介和创建新的数据库1、mysql简介与概要mysql是一个小型关系型数据管理系统,开发者为瑞典mysqlab公司现在已经被sun公司收购1.可以处理拥有上千万条记录的大型数据2.支持常见SQL语句规范3.可移植高,安装简单小巧4.良好的运行效率,…