这里解决的问题是当服务器有流量限制的时候,如何通过多线程达到流量上限,同时又如何通过限流器保证不超过流量上限。
根据官方文档的说明https://waditu.com/document/2?doc_id=27,获取日线行情有两种方式,一种是遍历股票代码,另一种是遍历交易日期。理论上讲,取得全量数据的时候遍历股票代码会更快,因为目前股票总数是4493,而交易日期已经有7450,遍历股票代码的循环次数会更少。但是因为我的积分太低,每次返回的数据上限是5000条,那么上市时间长的股票就需要查询两次。况且取增量数据的时候,肯定是按日期更好实现,所以最后决定还是就按交易日期的方式实现。
按目前的积分,tushare允许每分钟访问500次。实测单线程的时候,本地每分钟只能发出400个请求左右,没有达到最优的执行效率,所以引入线程池,把请求数打满。
def __get_stock_daily(self, start_date='19700101', max_worker=multiprocessing.cpu_count() * 2):
df_cal_date = StockCalendar().query(
fields='distinct cal_date',
where=f'is_open=\'1\' and cal_date >=\'{start_date}\' and cal_date < \'{tomorrow()}\''