Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4584764
  • 博文数量: 1214
  • 博客积分: 13195
  • 博客等级: 上将
  • 技术积分: 9105
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
个人简介

C++,python,热爱算法和机器学习

文章分类

全部博文(1214)

文章存档

2021年(13)

2020年(49)

2019年(14)

2018年(27)

2017年(69)

2016年(100)

2015年(106)

2014年(240)

2013年(5)

2012年(193)

2011年(155)

2010年(93)

2009年(62)

2008年(51)

2007年(37)

分类: Python/Ruby

2016-07-02 22:17:24

原文地址:
作者:auxten
链接:
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

超时函数

这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 、网络爬虫、数据库查询的时候特别有用

timeout装饰器的代码如下:

import signal,functools #下面会用到的两个库  class TimeoutError(Exception): pass #定义一个Exception,后面超时抛出  def timeout(seconds, error_message = 'Function call timed out'): def decorated(func): def _handle_timeout(signum, frame): raise TimeoutError(error_message) def wrapper(*args, **kwargs): signal.signal(signal.SIGALRM, _handle_timeout) signal.alarm(seconds) try: result = func(*args, **kwargs) finally: signal.alarm(0) return result return functools.wraps(func)(wrapper) return decorated 

使用:

@timeout(5) #限定下面的slowfunc函数如果在5s内不返回就强制抛TimeoutError Exception结束  def slowfunc(sleep_time): import time time.sleep(sleep_time) #这个函数就是休眠sleep_time秒  slowfunc(3) #sleep 3秒,正常返回 没有异常  slowfunc(10) #被终止  ## 输出  --------------------------------------------------------------------------- TimeoutError Traceback (most recent call last) 

Trace函数

有时候出于演示目的或者调试目的,我们需要程序运行的时候打印出每一步的运行顺序 和调用逻辑。类似写bash的时候的bash -x调试功能,然后Python解释器并没有 内置这个时分有用的功能,那么我们就“自己动手,丰衣足食”。

Trace装饰器的代码如下:

import sys,os,linecache def trace(f): def globaltrace(frame, why, arg): if why == "call": return localtrace return None def localtrace(frame, why, arg): if why == "line": # record the file name and line number of every trace  filename = frame.f_code.co_filename lineno = frame.f_lineno bname = os.path.basename(filename) print "{}({}): {}".format( bname, lineno, linecache.getline(filename, lineno).strip('\r\n')), return localtrace def _f(*args, **kwds): sys.settrace(globaltrace) result = f(*args, **kwds) sys.settrace(None) return result return _f 

使用:

@trace def xxx(): print 1 print 22 print 333 xxx() #调用  ## 输出  <ipython-input-4-da50741ac84e>(3): print 1 # @trace 的输出  1 <ipython-input-4-da50741ac84e>(4): print 22 # @trace 的输出  22 <ipython-input-4-da50741ac84e>(5): print 333 # @trace 的输出  333 
阅读(742) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~