上接第一篇 http://www.cnblogs.com/sdet/p/6874631.html

在python中,很简单地能把http请求通过异步的方式发送,以下代码在python 3.6.0上运行通过,

import asyncio
import requests async def main():
loop = asyncio.get_event_loop()
future1 = loop.run_in_executor(None, requests.get, 'http://www.google.com')
future2 = loop.run_in_executor(None, requests.get, 'http://www.google.co.uk')
response1 = await future1
response2 = await future2
print(response1.text)
print(response2.text) loop = asyncio.get_event_loop()
loop.run_until_complete(main())

按这个思路,把我上次的python 上传QC的工具移到python 3.6上,做简单改写后,上传文件速度变得飞快。

原来传1次10个文件,我用时485秒,Time: 485.037000 seconds

现在仅用时75秒,日志如下:

[2017-06-02 12:45:21,714] post http://xxxx.qc.com:80/qcbin/authentication-point/authenticate
[2017-06-02 12:45:22,401] headers = {'Authorization': 'Basic xxxxxxxxxx'}
[2017-06-02 12:45:22,401] 200 OK
[2017-06-02 12:45:22,401] --------------------
[2017-06-02 12:45:22,401] post http://xxxx.qc.com:80/qcbin/rest/domains/xxxx_domain/projects/xxxx_project/test-instances/894980/attachments
[2017-06-02 12:45:22,401] post http://xxxx.qc.com:80/qcbin/rest/domains/xxxx_domain/projects/xxxx_project/test-instances/894983/attachments
[2017-06-02 12:45:22,401] post http://xxxx.qc.com:80/qcbin/rest/domains/xxxx_domain/projects/xxxx_project/test-instances/894982/attachments
[2017-06-02 12:45:22,416] post http://xxxx.qc.com:80/qcbin/rest/domains/xxxx_domain/projects/xxxx_project/test-instances/894981/attachments
[2017-06-02 12:45:22,494] post http://xxxx.qc.com:80/qcbin/rest/domains/xxxx_domain/projects/xxxx_project/test-instances/894986/attachments
[2017-06-02 12:45:22,494] post http://xxxx.qc.com:80/qcbin/rest/domains/xxxx_domain/projects/xxxx_project/test-instances/894987/attachments
[2017-06-02 12:45:22,494] post http://xxxx.qc.com:80/qcbin/rest/domains/xxxx_domain/projects/xxxx_project/test-instances/894984/attachments
[2017-06-02 12:45:22,572] post http://xxxx.qc.com:80/qcbin/rest/domains/xxxx_domain/projects/xxxx_project/test-instances/894985/attachments
[2017-06-02 12:45:22,572] post http://xxxx.qc.com:80/qcbin/rest/domains/xxxx_domain/projects/xxxx_project/test-instances/894988/attachments
[2017-06-02 12:45:22,572] post http://xxxx.qc.com:80/qcbin/rest/domains/xxxx_domain/projects/xxxx_project/test-instances/894979/attachments
[2017-06-02 12:45:51,835] data = {'filename': ('', 'xxxx_file_name'), 'override-existing-attachment': ('', 'y')}
[2017-06-02 12:45:51,835] files = {'file': <_io.BufferedReader name='xxxx_file_name'>}
[2017-06-02 12:45:51,835] 200 OK
[2017-06-02 12:45:51,835] --------------------
[2017-06-02 12:45:59,504] data = {'filename': ('', 'xxxx_file_name'), 'override-existing-attachment': ('', 'y')}
[2017-06-02 12:45:59,504] files = {'file': <_io.BufferedReader name='xxxx_file_name'>}
[2017-06-02 12:45:59,504] 200 OK
[2017-06-02 12:45:59,504] --------------------
[2017-06-02 12:45:59,520] data = {'filename': ('', 'xxxx_file_name'), 'override-existing-attachment': ('', 'y')}
[2017-06-02 12:45:59,520] files = {'file': <_io.BufferedReader name='xxxx_file_name'>}
[2017-06-02 12:45:59,520] 200 OK
[2017-06-02 12:45:59,520] --------------------
[2017-06-02 12:46:03,244] data = {'filename': ('', 'xxxx_file_name'), 'override-existing-attachment': ('', 'y')}
[2017-06-02 12:46:03,244] files = {'file': <_io.BufferedReader name='xxxx_file_name'>}
[2017-06-02 12:46:03,244] 200 OK
[2017-06-02 12:46:03,244] --------------------
[2017-06-02 12:46:05,059] data = {'filename': ('', 'xxxx_file_name'), 'override-existing-attachment': ('', 'y')}
[2017-06-02 12:46:05,059] files = {'file': <_io.BufferedReader name='xxxx_file_name'>}
[2017-06-02 12:46:05,059] 200 OK
[2017-06-02 12:46:05,059] --------------------
[2017-06-02 12:46:08,068] data = {'filename': ('', 'xxxx_file_name'), 'override-existing-attachment': ('', 'y')}
[2017-06-02 12:46:08,068] files = {'file': <_io.BufferedReader name='xxxx_file_name'>}
[2017-06-02 12:46:08,068] 200 OK
[2017-06-02 12:46:08,068] --------------------
[2017-06-02 12:46:10,090] data = {'filename': ('', 'xxxx_file_name'), 'override-existing-attachment': ('', 'y')}
[2017-06-02 12:46:10,090] files = {'file': <_io.BufferedReader name='xxxx_file_name'>}
[2017-06-02 12:46:10,090] 200 OK
[2017-06-02 12:46:10,090] --------------------
[2017-06-02 12:46:13,878] data = {'filename': ('', 'xxxx_file_name'), 'override-existing-attachment': ('', 'y')}
[2017-06-02 12:46:13,878] files = {'file': <_io.BufferedReader name='xxxx_file_name'>}
[2017-06-02 12:46:13,878] 200 OK
[2017-06-02 12:46:13,878] --------------------
[2017-06-02 12:46:14,299] data = {'filename': ('', 'xxxx_file_name'), 'override-existing-attachment': ('', 'y')}
[2017-06-02 12:46:14,299] files = {'file': <_io.BufferedReader name='xxxx_file_name'>}
[2017-06-02 12:46:14,299] 200 OK
[2017-06-02 12:46:14,299] --------------------
[2017-06-02 12:46:36,965] data = {'filename': ('', 'xxxx_file_name'), 'override-existing-attachment': ('', 'y')}
[2017-06-02 12:46:36,965] files = {'file': <_io.BufferedReader name='xxxx_file_name'>}
[2017-06-02 12:46:36,965] 200 OK
[2017-06-02 12:46:36,965] --------------------
TIME: 75.2970232963562

从日志上看,10个上传请求,在1秒钟内从本地发起。并在30秒后开始陆续收到QC服务器的响应。

改写的思路:

原来的写法:

把10个post请求组装好,在一个for循环中一个一个依次发送。

现在的写法:

先把10个post请求组装好,交给asyncio的event loop,然后await这些请求。

 response1 = await future1
response2 = await future2

这两句执行的时候,python使用异步的方式,不会阻塞住程序等第一个响应回来,

而是会直接往下走,把所有请求都发出去。再等服务器一个一个回应。

于是这个小工具的代码逻辑就从:

执行一段可能是计算也可能是IO的逻辑------》如果是IO的话就等IO完成------》执行一段可能是计算也可能是IO的逻辑------》这样继续循环下去

变成了:

执行一段计算--------》异步批量执行一些IO---------》等这一批IO完成----》执行下一段计算--------》异步批量执行一些IO--------》这样继续循环下去

小结完毕,继续学习。。。

python小工具:用python操作HP的Quality Center (二)----- 用异步方式提高速度的更多相关文章

  1. python小工具:用python操作HP的Quality Center

    背景是这样的:这个组的测试人员每跑一个case都要上传测试结果附件到QC.每个待测功能模块可能包含几十上百的case.于是手工上传测试结果变成了繁重的体力劳动.令人惊讶的是我们的工具开发组竟然说做不了 ...

  2. Python小工具--删除svn文件

    有的时候我们需要删除项目下的svn相关文件,但是SVN会在所有的目录下都创建隐藏文件.svn,手工一个个目录查找然后删除显然比较麻烦.所以这里提供了一个Python小工具用于批量删除svn的相关文件: ...

  3. python小工具myqr生成动态二维码

    python小工具myqr生成动态二维码 (一)安装 (二)使用 (一)安装 命令: pip install myqr 安装完成后,就可以在命令行中输入 myqr 查看下使用帮助: myqr --he ...

  4. 有哪些你不知道的python小工具

    python作为越来越流行的一种编程语言,不仅仅是因为它语言简单,有许多现成的包可以直接调用. python中还有大量的小工具,让你的python工作更有效率. 1.- 快速共享 - HTTP服务器 ...

  5. 分享一个 Linux 环境下,强力的Python 小工具

    场景 Linux 用户,经常需要在终端查看一些数据,从文件里看 或者网络协议获取数据并查看. 比如,查看文件里的json数据:比如,查看etcd里存下的数据. 如果直接看cat 或者 curl 得到的 ...

  6. 一个Json结构对比的Python小工具兼谈编程求解问题

    先上代码. jsondiff.py #!/usr/bin/python #_*_encoding:utf-8_*_ import argparse import json import sys rel ...

  7. 自制 Python小工具 将markdown文件转换成Html文件

    今天看到了一个Python库,名为markdown.瞬间就给了我一个灵感,那就是制作一个将markdown文件转换成html文件的小工具. 我的实验环境 操作系统: Windows 7 64位 旗舰版 ...

  8. Python小工具:利用ffmpy3库3秒钟将视频转换为音频

    作者 | pk 哥 来源公众号 | Python知识圈(ID:PythonCircle) 最近,有读者微信上私聊我,想让我写一篇视频批量转换成音频的文章,我答应了,周末宅家里把这个小工具做出来了. 这 ...

  9. 周报?谁还写周报啊?不都用Python小工具: 发个周报邮件给老板就行还写周报啊?不都用Python小工具: 发个周报邮件给老板就行

    缘起: 新跳槽到一家公司, 没想到第一个挑战居然是每周都要发周报. 告诉老板这周都干了些什么和下周准备干什么. 我记性不好, 常常忘事儿.所以很多时候周报都会忘记发送. 于是, 就决定写一个小工具好了 ...

随机推荐

  1. Java在Debug的时候,有些变量能无限展开(循环了)?

    抛异常的时候,Java Debug 时,有些变量能无限展开,怎么做到的? 先来一个报错的例子: Exception in thread "main" java.lang.Stack ...

  2. ios ALAssetsLibrary简单的使用

    关于ALAssetsLibrary的简单使用有两个方面: 第一:存储图片/视频方法如下: // With a UIImage, the API user can use -[UIImage CGIma ...

  3. zepto.js介绍

    是一个阉割版的jQuery zepto不支持jQuery过于复杂的选择器,比如:first :last :eq zepto如果要用动画必须再次引包 zepto能将css3中transition支持的动 ...

  4. 简单的总结一下iOS面试中会遇到的问题

    1.线程是什么?进程是什么?二者有什么区别和联系?  一个程序至少有一个进程,一个进程至少有一个线程: 进程:一个程序的一次运行,在执行过程中拥有独立的内存单元,而多个线程共享一块内存 线程:线程是指 ...

  5. 《阿里巴巴Java开发手册(正式版》读记

    前几天,阿里巴巴发布了<阿里巴巴Java开发手册(正式版>,第一时间下载阅读了一番. 不同于一般大厂内部的代码规范,阿里巴巴的这本Java开发手册,可谓包罗万象,几乎日常Java开发中方方 ...

  6. Python 操作 MySQL 的正确姿势

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:邵建永 使用Python进行MySQL的库主要有三个,Python-MySQL(更熟悉的名字可能是MyS ...

  7. .net 做工作流时,生成项目后工具箱里有关工作流的东西不显示解决方法

    在做工作流模块时,遇到一个比较棘手的问题,那就是生成项目后工具箱里有关工作流的东西不显示,这个问题令人百思不得其解,经过查阅英文网站,终于找到解决方法: 把项目中的建模项目移除掉,再重新生成,奇迹出现 ...

  8. Python-3------新年考试周的Python学习

    2016一开始就是考试周,准备专业课的考试复习.每天上午复习,晚上复习到8点半,之后到10点这点时间来看Python.庆幸没有在忙碌的时候荒废 Python的学习. 期待寒假,以前寒假在家总是没事做, ...

  9. 使用window.btoa和window.atob来进行Base64编码和解码

      方法描述 WindowBase64.atob() 函数用来解码一个已经被base-64编码过的数据. WindowBase64.btoa() 函数 将ascii字符串或二进制数据转换成一个base ...

  10. FTP中MLST概要解读---解决获取ftpFile为null的另外一种方式

    零.引言 之前写FTP工具库,用的是ftp4j,他使用其他非常简单方便,但是在细节上提供的可选项比较少(当然也可能是我了解不够深刻) 最新的项目重写了FTP工具类,选择了apache net中的ftp ...