线程池
Python线程池可以并发的快速处理,是比较常用的包
问题描述
日常我们写一个方法去处理数据比较简单,突然需要处理大量的数据,使用函数循环调用太慢; 线程池此时就能排上用处,可以并发的处理,而每次都实现代码不稳定,且不优雅,并且没办法批量修改 这里给出一种通过注解形式的实现 基于切片的思想,使用修饰器(和Java注解的形式类似,不知这样思考是否正确,望大佬指教)
只需要在要执行的函数上添加一个注解,就能够将函数并发的执行
@threaded_pool(data)
使用如下:(如果涉及的*@log*不明白,可以参考 Python日志组件–基于修饰器)
from MyLog import log, log_init
from ThreadedPoolCore import threaded_pool
data = range(1, 10)
@threaded_pool(data)
@log
def function(n):
return n*n
if __name__ == '__main__':
log_init()
function()
输出结果
2021-09-17 23:37:14,576 - [INFO - Function (function) use Threads:10]
2021-09-17 23:37:14,576 - [INFO - Threaded pool start]
2021-09-17 23:37:14,576 - [INFO - (function) (1,) -> 1]
2021-09-17 23:37:14,576 - [INFO - (function) (2,) -> 4]
2021-09-17 23:37:14,577 - [INFO - (function) (3,) -> 9]
2021-09-17 23:37:14,577 - [INFO - (function) (4,) -> 16]
2021-09-17 23:37:14,577 - [INFO - (function) (5,) -> 25]
2021-09-17 23:37:14,577 - [INFO - (function) (6,) -> 36]
2021-09-17 23:37:14,577 - [INFO - (function) (7,) -> 49]
2021-09-17 23:37:14,577 - [INFO - (function) (8,) -> 64]
2021-09-17 23:37:14,578 - [INFO - (function) (9,) -> 81]
2021-09-17 23:37:14,578 - [INFO - All Threads end]
这里可以手动调节线程池的数量
只需要修改
@threaded_pool(data)
为
@threaded_pool(data, threads=20)
便可以根据需求,随心所欲的调节并发数量
代码实现
ThreadedPoolCore.py代码实现:
import functools
from concurrent.futures import ThreadPoolExecutor
from MyLog import logger
def threaded_pool(data_list, threads=10):
"""
data_list: 参数列表
threads:线程大小
"""
def middle(func):
@functools.wraps(func)
def inner(*args, **kwargs):
executor = ThreadPoolExecutor(max_workers=threads)
logger.info(f"Function ({func.__name__}) use Threads:{threads}")
logger.info(f"Threaded pool start")
executor.map(func, data_list)
executor.shutdown(wait=True)
logger.info(f"All Threads end")
return inner
return middle
系列文章链接
|