项目情景描述

  在restful架构风格的项目交付测试的过程中,某接口出现 请求超时导致的http 502 Bad Gateway,于是开始排查具体是接口函数中的哪行代码或函数 响应时间过长导致的502错误

刚开始的解决方法:

  土鳖式的导入 time模块进行时间计算,从而查出具体响应时间过长的位置

  如下:

 import time import time
from flask import Flask
app = Flask(__name__) app.route('/line_test')
def line_test():
#土鳖方法
first_time=time()
for item in range(5):
time.sleep(1)
#土鳖方法
print time()-first_time
for item in xrange(5):
time.sleep(0.5)
#土鳖方法
print time()-first_time

  方法缺点:需要大量时间编写 关于 time()的代码,最后还要删除这些代码,浪费时间

现在的解决方法:

  使用python的 line_profiler 模块,此模块是用来测试 函数 每行代码的响应时间等情况

  具体思路:将 line_profiler相关函数封装在装饰器 中 进行使用,这样 在接口请求时,则会执行此装饰器并打印出结果

  windows安装方法:https://www.lfd.uci.edu/~gohlke/pythonlibs/#line_profiler

  代码如下:

 #coding:utf8
from flask import Flask, jsonify
import time
from functools import wraps
from line_profiler import LineProfiler #查询接口中每行代码执行的时间
def func_line_time(f):
@wraps(f)
def decorator(*args, **kwargs):
func_return = f(*args, **kwargs)
lp = LineProfiler()
lp_wrap = lp(f)
lp_wrap(*args, **kwargs)
lp.print_stats()
return func_return
return decorator
18 app = Flask(__name__) @app.route('/line_test')
@func_line_time
def line_test():
for item in range(5):
time.sleep(1)
for item in xrange(5):
time.sleep(0.5)
return jsonify({'code':200}) if __name__=='__main__':
app.run()

  当浏览器请求接口时得到的结果如下:

  

 * Running on http://127.0.0.1:5000/
Timer unit: 1e-06 s Total time: 7.50827 s
File: /home/rgc/baidu_eye/carrier/test/flask_line_profiler_test.py
Function: line_test at line 22 Line # Hits Time Per Hit % Time Line Contents
==============================================================
22 @app.route('/line_test')
23 @func_line_time
24 def line_test():
25 6 33.0 5.5 0.0 for item in range(5):
26 5 5005225.0 1001045.0 66.7 time.sleep(1)
27 6 31.0 5.2 0.0 for item in xrange(5):
28 5 2502696.0 500539.2 33.3 time.sleep(0.5)
29 1 282.0 282.0 0.0 return jsonify({'code':200}) 127.0.0.1 - - [05/Mar/2018 15:58:21] "GET /line_test HTTP/1.1" 200 -

返回结果中 具体 含义:

Total Time:测试代码的总运行时间

Line:代码行号
Hits:表示每行代码运行的次数  
Time:每行代码运行的总时间  
Per Hits:每行代码运行一次的时间  
% Time:每行代码运行时间的百分比

从 中便可看到 具体 26行代码执行时间最长。

方法优点:只需要添加一个装饰器,再接口函数前引用即可,删除也容易,且 装饰器可以重复使用,节省大量时间。

其他关于line_profiler的使用方法:

在脚本中使用此方法:

 #coding:utf8
import cgi
import time
from line_profiler import LineProfiler def test2():
print 'hello!test2()' def test1():
html='''<script>alert("you are a good boy!&I like you")</scrpit>'''
test2()
escape_html=cgi.escape(html)
for item in range(5):
time.sleep(1)
print escape_html

if __name__=='__main__':
lp=LineProfiler()
#同时显示函数每行所用时间和调用函数每行所用时间,加入add_function()
lp.add_function(test2)
lp_wrap=lp(test1)
#如果被测函数有入参,下面一行为 lp_wrap(被测函数入参)
lp_wrap()
lp.print_stats()

直接运行显示结果:

 * Running on http://127.0.0.1:5000/
Timer unit: 1e-06 s Total time: 7.50827 s
File: /home/rgc/baidu_eye/carrier/test/flask_line_profiler_test.py
Function: line_test at line 22 Line # Hits Time Per Hit % Time Line Contents
==============================================================
22 @app.route('/line_test')
23 @func_line_time
24 def line_test():
25 6 33.0 5.5 0.0 for item in range(5):
26 5 5005225.0 1001045.0 66.7 time.sleep(1)
27 6 31.0 5.2 0.0 for item in xrange(5):
28 5 2502696.0 500539.2 33.3 time.sleep(0.5)
29 1 282.0 282.0 0.0 return jsonify({'code':200}) 127.0.0.1 - - [05/Mar/2018 15:58:21] "GET /line_test HTTP/1.1" 200 -

相对于另一种使用方法:

  1.在需要测试的函数前添加装饰器  @profile

  2.启动程序 $kernprof -l -v test.py

无需 实际运行项目时删除@profile,如需单独测试此函数,直接使用 if __name__=='__main__': 即可,这样在其他函数引用时,不会执行line_profiler相关代码。

相关博客:

http://blog.csdn.net/guofangxiandaihua/article/details/77825524

  

使用line_profiler查看api接口函数每行代码执行时间的更多相关文章

  1. Linux平台下利用系统接口函数按照行读写文件

    要求:支持大文件(1M)一次性读入 源代码如下: #include<stdio.h> #include<fcntl.h> #include<stdlib.h> #i ...

  2. Visual Studio 2010/2013 查看DLL接口(函数)

    1. “应用程序" Visual Studio 2010/2013 的Visual Studio Tools文件夹中打开Visual Studio Command Prompt 命令提示窗口 ...

  3. 在C++里一个类成员函数多少行代码才是最好呢?

    这个问题,很多同事以及学生都问我这个问题.其实这是一个比较实际的问题,因为设计一个类成员函数的好与坏,决定了一个类代码的质量. 为了回答这个问题,昨晚又重新看看斯坦福大学的编程视频,可以用下面这个截图 ...

  4. Python+moviepy使用manual_tracking和headblur函数10行代码实现视频人脸追踪打马赛克

    ☞ ░ 前往老猿Python博文目录 ░ 一.背景知识 1.1.headblur简介 追踪人脸打马赛克需要使用headblur函数. 调用语法: headblur(clip,fx,fy,r_zone, ...

  5. 使用PHP自带zlib函数 几行代码实现PHP文件打包下载zip

    <?php //获取文件列表 function list_dir($dir){ $result = array(); if (is_dir($dir)){ $file_dir = scandir ...

  6. SQLite3开发接口函数详解

    SQLite3是SQLite一个全新的版本,它虽然是在SQLite 2.8.13的代码基础之上开发的,但是使用了和之前的版本不兼容的数据库格式和API. SQLite3是为了满足以下的需求而开发的: ...

  7. Linux内核驱动之GPIO子系统API接口概述

    1.前言 在嵌入式Linux开发中,对嵌入式SoC中的GPIO进行控制非常重要,Linux内核中提供了GPIO子系统,驱动开发者在驱动代码中使用GPIO子系统提供的API函数,便可以达到对GPIO控制 ...

  8. onps栈使用说明(1)——API接口手册

    1. 底层API 由协议栈底层提供的api,用于涉及底层操作的一些功能实现,这些api接口函数的原型定义分布于不同的文件,它们被统一include进了onps.h中: open_npstack_loa ...

  9. libEasyPlayer RTSP windows播放器SDK API接口设计说明

    概述 libEasyPlayer实现对RTSP直播流进行实时采集和解码显示,稳定,高效,低延时:解码可采用intel硬件解码和软件解码两种方式,能实时进行录像和快照抓图,OSD叠加等功能. API接口 ...

随机推荐

  1. trait

    参考 引文 在php中,为实现代码复用,有了继承,但是一个类只能继承一个父类,不支持多继承,接口支持多实现,但是接口又不太一样,接口对外负责功能调用声明,不负责实现,由实现了接口的类去实现具体功能逻辑 ...

  2. SpringMVC空字符串转为null

    空字符串转为null 现在我遇到这样一个需求,那就是我想要吧前端传过来的值变为空,因为所谓前端的校验,其实都不是校验,如果前端传给后台一个表单,可是表单未填入值,我们后台进行判断的时候 既需要判断nu ...

  3. gulp最简示例

    全局安装 $ npm gulp -g 作为项目的开发依赖安装 $ npm gulp --save-dev 脚本文件 在根目录创建gulpfile.js文件 const gulp = require(' ...

  4. Django跨域请求之JSONP和CORS

    现在来新建一个Django项目server01,url配置为 url(r'^getData.html$',views.get_data) 其对应的视图函数为get_data: from django. ...

  5. Ubuntu14.04 命令行下安装teamviewer

    下载teamviewer 链接:https://pan.baidu.com/s/1hs0BppM  密码:sdmk 上传到 /home/[user] cd /home/[user] 移动安装包到 /o ...

  6. MySQL笔记-turncat、drop、delete的区别

    TRUNCATE 语法: TRUNCATE TABLE [schema.] table [{DROP | REUSE} STORAGE]功能: 删除整个表的数据并释放空间   描述: 由于Trunca ...

  7. 使Eclipse下支持编写HTML/JS/CSS/JSP页面的自动提示

    1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist 修改Auto Activation triggers for java的值为:zj ...

  8. NIO基础篇(一)

    1.NIO与传统IO的比较 Java的NIO(New IO)是不同于旧IO的,旧的IO是基于字节流和字符流的,是阻塞的IO.NIO是基于通道(Channel)和缓冲区(Buffer)的,是非阻塞的IO ...

  9. ES6知识点大汇总

    1 //1.搭建ES6的开发环境: 2 let a=1; 3 console.log(a); 4 //2.var 声明的是全局变量 全局变量会污染外部的区块 5 //let 局部变量 6 //cons ...

  10. 为什么webstrom无法格式化代码?

    用过webstrom的童鞋都知道格式化代码需要按快捷键:ctrl+Alt+L:可是我最近发现这个快捷键不管用,今天终于知道了原因, 是后台网易云音乐没有关,和网易云音乐的快捷键冲突了,就是这么神奇没办 ...