来源 /腾讯课堂Coding学院(ID:ke_coding)
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 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|