上一篇股票文章中,我们讲了如何通过tushare下载股票数据,并存入mongodb:
Python 获取股票数据并存入MongoDB实战教程
其中有非常大的优化空间,比如,单线程的下载速度太慢了,能不能用多线程的方式?有时候网络连接会失败,能不能增加重试机制?
这些问题,我们将在这篇文章里进行优化。
本项目已开源至GitHub,若网络无法访问,请在Python实用宝典后台回复 股票异步下载器 下载源代码,GitHub链接:
https://github.com/Ckend/stock_download_celery
1.准备
开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda
Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。
当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端运行命令安装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南。
在终端输入以下命令安装我们所需要的依赖模块:
pip install celery
pip install eventlet
看到 Successfully installed xxx 则说明安装成功。
本文章是 Python 获取股票数据并存入MongoDB实战教程 的优化版,请根据该文章提前装好tushare和mongodb.
除此之外,你还需要安装celery和eventlet:
pip install celery
pip install eventlet
看到 Successfully installed xxx 则说明安装成功。
Celery是一个强大的异步任务队列,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。
我们通常使用它来实现异步任务(async task)和定时任务(crontab)。
为了能异步下载股票,我们需要将上篇文章的内容拆分为两个部分:
1.Celery任务:获得某股票的日线数据;
2.分发任务:分发获取指定股票的日线数据;
这样,在我们的场景中,使用Celery实现异步任务主要包含三个步骤:
1.创建Celery任务实例(获得某股票的日线数据)
2.启动Celery Worker,用于运行任务
3.应用程序分发任务(分发获取指定股票的日线数据)
思路已经理清楚了,下面动手实践一下:
此处大部分代码和上篇文章相似,因此下面仅显示和celery相关的核心代码:
在cmd执行以下命令启动celery worker:
python -m celery worker -A tasks --loglevel=info --pool=eventlet
注意,这里使用了--pool=eventlet,是为了让windows机器具有并行运行的能力。
遍历一遍股票列表,通过delay调用Celery任务实例,将任务分发给worker:
这样,worker就会在后台异步执行这些任务,切换到worker的命令行中,你会看到输出如丝般润滑:
好景不长,不久后你肯定会收到tushare发送回来的CPS限制错误:
Exception: 抱歉,您每分钟最多访问该接口800次,权限的具体详情访问:https://tushare.pro/document/1?doc_id=108。
为了解决这个CPS问题,我确实花了不少时间,尝试控制worker频率,无果,最终选择了一个不是办法的办法:
在Tushare报错的时候,捕捉起来,控制其60秒后重试
简单,但有效。
此外,为了防止网络请求出现问题,导致某个任务丢失,我们还可以在下发任务的时候使用apply_async配置失败重试。默认重试三次:
这样,一个相对健壮的股票数据异步下载器就完成了。
用该方法把A股所有股票下载一遍,应该不会超过5分钟。
如果你给Tushare氪了金,没有cps限制,下载时间不会超过1分钟。
目前github上好像缺少这样的项目,因此我将该项目开源到了GitHub上:
https://github.com/Ckend/stock_download_celery
目前仅支持日线数据,还有许多可以补充和优化的点,欢迎同我一起改进。
我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。
有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。
原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!
点击下方阅读原文可获得更好的阅读体验
Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典