Python线程池:vthread
1. vthread
这个模块非常简洁方便, 只需要2句话
import vthread
@vthread.pool(10, join=True)
2. 案例
#!/usr/bin/env python # -*- encoding: utf-8 -*- ''' @Author: Victor @Contact: _ycyj@163.com @Date: 2020/10/14 @function: '' ''' import time import datetime import threading from threading import Thread from loguru import logger import vthread class NewsToday(object): """ 请求 所有股票 最新新闻 """ def __init__(self): super(NewsToday, self).__init__() # 线程池数 self.pool_num = 4 # 根据进程数分组 self.all_codes_group = [] def _get_all_codes_group(self): """ 获取股票进行分组 :return: """ self.all_codes_group.clear() for i in range(self.pool_num): self.all_codes_group.append(self.all_codes[i::self.pool_num]) logger.info("stock groups: {}".format(self.all_codes_group)) return self.all_codes_group @vthread.pool(10, join=True) def exe_function(self, group_index, codes_arr): start = time.time() total_num = len(codes_arr) for code_index, code in enumerate(codes_arr): print(code_index, code) end = time.time() logger.info('{} 组, {} 个, 采集完成 用时:{}'.format(group_index, total_num, (end - start))) return True def start(self): """ 开启运行 @return: """ self.all_codes = [1, 2, 3, 4, 8, 9, 11, 21, 22] self.all_codes_group = self._get_all_codes_group() logger.info('开始采集') while True: try: for ind, codes_arr in enumerate(self.all_codes_group): if codes_arr: self.exe_function(ind, tuple(codes_arr)) time.sleep(2) except Exception as ex: logger.error('exception: error{}'.format(ex)) time.sleep(10) return True if __name__ == '__main__': x = NewsToday() x.start()