阅读时间 8 分钟
> 作者的生产环境刚从2.6升级到3.5.0,但满足不了aiohttp的最低版本需求。所以在有了这篇文章,如何改造代码,充分利用python3.5 asyncio提供的异步功能。原文链接
近日IT部门最终将我们工作环境的分布式Python版本升级到了3.5.0。这对从2.6版本来说是一次巨大的升级,但依然有些遗憾。3.5.0 不能满足一些库的最小版本需求,这其中就包括aiohttp。
尽管有这些限制,我依然需要写脚本从我们的API获取数以百计的csv文件,然后处理数据。Python本身并不想NodeJS那样基于事件驱动和原生异步,但这并不妨碍Python 也能实现一样的功能。这篇文档将详细介绍我如何学习异步操作,并列出它的优势。
声明: 如果你有更高的版本(3.5.2+),强烈推荐你使用aiohttp。这是个非常健壮的库, 特别适合解决这类问题。网上也有很多关于她的教程。
假设
作如下假设:
> * 熟悉Python和它的语法 > * 熟悉基础的网络请求 > * 知道异步执行的概念
开始
安装requests
$ python -m pip install requests
没有权限可以做如下安装
$ python -m pip install requests --user
错误的做法:同步请求
为了体现并行的好处,先看看同步的做法。我大概描述一下代码将要做什么。我们要执行一个能获取csv文件的GET请求,测量读取其中文本的时间。
我们将从这个网址(https://people.sc.fsu.edu/~jburkardt/data/csv/)下载多个csv文件, 里面有很多实例数据。
在说明一下,我们将用requests 库里 Session对象,执行GET请求。
首先,需要一个方法执行web请求:
def fetch(session, csv):
base_url = "https://people.sc.fsu.edu/~jburkardt/data/csv/"
with session.get(base_url + csv) as response:
data = response.text
if response.status_code != 200:
print("FAILURE::{0}".format(url))
# Return .csv data for future consumption
return data
这个函数使用Session对象和csv名字,执行网络请求,然后返回response里的文本内容。
下面,我们需要一个函数遍历文件列表,然后去请求,统计执行请求的时间。
from timeit import default_timer()
def get_data_s