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

Python中线程Timeout的使用相关推荐

  1. python中线程和进程_python中线程和进程的简单了解

    一.操作系统.应用程序 1.硬件:硬盘.cpu.主板.显卡........ 2.装系统(本身也是一个软件): 系统就是一个由程序员写出来的软件,该软件用于控制计算机得硬盘,让他们之间进行互相配合. 3 ...

  2. python中线程里面多线程_Python中的线程和多线程是什么

    一.线程的概念 一个进程里面至少有一个控制线程,进程的概念只是一种抽象的概念,真正在CPU上面调度的是进程里面的线程,就好比真正在地铁这个进程里面工作的实际上是地铁里面的线程,北京地铁里面至少要有一个 ...

  3. Python中线程间通信

    Python中线程间通信 一.前言 二.什么是互斥锁 三.使用互斥锁 四.使用队列在线程间通信 五.关于线程需要注意的两点 一.前言   我们已经知道进程之间不能直接共享信息,那么线程之间可以共享信息 ...

  4. python协程是什么_在python中线程和协程的区别是什么

    在python中线程和协程的区别:1.一个线程可以拥有多个协程,这样在python中就能使用多核CPU:2.线程是同步机制,而协程是异步:3. 协程能保留上一次调用时的状态,每次过程重入时,就相当于进 ...

  5. python中线程安全的数据结构_Scala(八)-①-数据结构-集合操作-线程安全的集合-操作符重载...

    ① 集合操作 Why 为什么需要集合操作?集合操作都包括哪些?Scala的集合操作主要为了适应大数据的发展,我们以Map为例.于事需入局,于程需入题,先看下题. 入题 请将list(3,5,7) 中的 ...

  6. 如何改变 Python 中线程的执行顺序

    一.主线程会等待所有的子线程结束后才结束 首先我看下最普通情况下,主线程和子线程的情况. import threading from time import sleep, ctimedef sing( ...

  7. pthread_create函数阻塞了主线程_5个状态,Python 中线程的生命周期

    编 程 的 朝 圣 之 路 ---------------------------------------- 当程序中包含多个线程时,CPU 不是一直被特定的线程霸占,而是轮流执行各个线程. 那么,C ...

  8. python中线程同步_Python线程同步在实际应用中功能体现

    在Python编程语言中,对于线程的操作是一个比较重要的应用技术.我们将会在这篇文章中为大家详细介绍一下这方面的相关基础内容,Python线程同步的应用方式.多个执行线程经常要共享数据,如果仅仅读取共 ...

  9. python中typeerror是什么意思_为什么在Python中线程会出现TypeError

    我得到了下面的代码,这是基于我在这里找到的一个例子,但当我运行它时,我得到了一个错误.请帮忙,我相信很简单:def listener(port): sock = socket.socket(socke ...

最新文章

  1. 必要时调整应用程序每个辅助进程的线程数
  2. angularjs通过ng-change和watch两种方式实现对表单输入改变的监控
  3. 企业级Python开发大佬利用网络爬虫技术实现自动发送天气预告邮件
  4. 使用VS2008进行WEB负载测试
  5. DCMTK:数据字典测试程序
  6. 《2021 年中国视频云场景应用洞察白皮书》联合首发!
  7. linux下C获取系统时间的方法
  8. 交换局域网(链路层+以太网+交换机)
  9. shiro 认证和授权原理
  10. 原创精美微信小程序UI界面——抖音版的“知乎”来啦
  11. ARMv8-A TrustZone概述
  12. DarkComet Analysis – Understanding the Trojan used in Syrian Uprising
  13. linux pkg解压工具,Pkg 1.3.0 发布,FreeBSD 的包管理工具
  14. 正睿17+2天集训总结TOT
  15. QT实现弹幕和webp格式礼物动效
  16. windows下修改中用户名为英文
  17. 浙江有计算机学校吗,浙江2021年哪里有计算机学校
  18. Rockset:最具潜力、最值得加入的大数据初创公司
  19. Ardiuno驱动Apds9960手势识别
  20. 【macOS】homebrew安装和解决brew安装速度慢的问题

热门文章

  1. ecshop模板smarty foreach详解 [ECshop]
  2. Apache模块开发helloworld无错版
  3. TeamViewer介绍:远程控制计算机
  4. oracle数据库性能awr,常见问题:如何使用AWR报告来诊断数据库性能问题
  5. findler mac 隐藏文件_Fiddler使用文档
  6. 爬虫python爬取页面请求_Python网络爬虫第三弹《爬取get请求的页面数据》
  7. python爬取疫情信息html.xpath p标签_python xpath 如何过滤div中的script和style标签
  8. ajax post的回调函数另一个方法,jQueryajax–post()方法 - 米扑博客
  9. asp导出word中文乱码_解决文档打开乱码问题丨小工具系列
  10. 关于Cocoa Pods的升级安装和使用说明