首页 存档 技术 查看内容

Python基于协程的GithubAPI连接池 01环境准备 02核心思想 03ApiPool类的实现 04性能

2018-3-30 13:00 |来自: 互联网 312 0

摘要: 来源 /腾讯课堂Coding学院(ID:ke_coding) 导语Github API功能强大,可以取到大部分的Github公有项目数据,操作有权限的库。但是它有一个**,即使是通过Basic Authentication或OAuth认证的请求,也只允许有50 01 ...

来源 /腾讯课堂Coding学院(ID:ke_coding)

导语

Github API功能强大,可以取到大部分的Github公有项目数据,操作有权限的库。但是它有一个限制,即使是通过Basic Authentication或OAuth认证的请求,也只允许有50

01环境准备

1、Python3 :其实对Python版本没要求,只是我这边示例的语法是基于Python3.6写的

2、Linux开发环境下配置好pip代理

3、安装开源依赖包:其中,gevent是Python的一个功能强大的协程并发库,是我们连接池做并发接口的基础。github3.py是一个访问GithubAPI的Python SDK,它可以为我们节约大量的时间去自己写请求访问Github API。

02核心思想

1、多账号Token

创建多个Github用户,生成多个Token,分别建立API连接;

2、API连接表

采用一个List维护保存所有API连接,是Pool的基础;

3、API连接队列

采用一个Queue保存当前可用的API连接,以阻塞式的get方法获取一个API连接;

4、Checker机制

设立Check协程,定时地遍历所有Pool中的API连接,确认可用Github Rate Limit。并依据API连接的Waiting状态,把那些可用的API连接重新入Queue;

先看一下ApiPool构造的主要流程:在ApiPool建立时,先是把所有的Token都组装成了API(图中未画的是置API都为Waiting状态),并通过调用Github的接口获取其剩余Limit,为每个API做Limit计数。然后,通过分析当前API的状态,把可用的API入到Queue里去备用。

最后,建立Checker协程,定时地执行Checker流程,保证那些使用超出Limit的API在一段时间后,可以重新入到Queue里来。

5、待执行函数封装

通过传入函数的方式,包装待执行的函数。在执行前从Queue里拿到API,在执行后,减少Limit计数,并重新确认API的可用性;图中省略了异常处理的逻辑,主要是执行时的重试机制。

6、Limit不可信策略

虽然Limit值的修改加了锁,但是在并发的情况下,Limit的数值其实并不代表了准确的Github Token剩余可用数。因为github3.py的机制,它提供的方法,可能并不止一次访问Github API(有分页机制、惰性itertor遍历),而又取不到实际上一个方法调用后导致访问Github多少次。那么上面流程中的,Limit-1就有可能少减。

当程序计数Limit

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部