python 线程池
就是把并发执行的任务传递给一个线程池,来替代为每个并发执行的任务都启动一个新的线程。只要池里有空闲的线程,任务就会分配给一个线程执行。
import random
import time
import threadpool
def printNumber(n: int) -> None:
while True:
print(n)
time.sleep(n)
if __name__ == '__main__':
poolsize = 5
pool = threadpool.ThreadPool(poolsize) #创建一个可存放poolsize个数目的线程的线程池
random_list = []
for i in range(100):
a = random.randint(1, 10)
random_list.append(a)
requests = threadpool.makeRequests(printNumber, random_list) #调用makeRequests创建请求。 makeRequests([0])是需要开启多线程处理的函数,makeRequests([1])是函数参数,makeRequests([2])是可选参数回调,默认是无。
[pool.putRequest(req) for req in requests] #把运行多线程的函数放入线程池中
pool.wait() #等待所有的线程完成工作后退出
进阶
1、 回调参数,子线程和主线程相互通信
以我的一个爬虫项目为例
unit_list = []
def get_func_result(request, result): ##get_func_result 回调函数通信主线程
if result: #判断列表是否为空,为空返回False
unit_list.append(result)
#all_content_str 为文本时str类型,all_bidding_unit是一个长度为13w的列表,all_list为长度为230的列表
def get_company_from_db_list(all_content_str,all_bidding_unit,all_list):
#内容省略
return unit_list #返回一个列表
analysis_result_all_list = []
splited_list = split_data_array(len(all_bidding_unit), 200) #分成一个1*700的二维数组,每个子列表长度为200
######## 进行一一匹配 #############
split_bidding_unit_list = []
for splited_index_list in splited_list:
temp_list = []
for index in splited_index_list:
temp_list.append(all_bidding_unit[index - 1])
split_bidding_unit_list.append(copy.deepcopy(temp_list)) #将数据按数组进行分割
######### 对线程池进行参数设置 ##########
fan_var = []
for i in range(len(splited_list)): #生成多参数线程池的列表参数
list_var = [all_content_str, split_bidding_unit_list[i], all_list]
list_var = (list_var, None)
fan_var.append(list_var)
pool_size = 200
pool = threadpool.ThreadPool(pool_size)
request_pool = threadpool.makeRequests(get_company_from_db_list, fan_var, get_func_result)
[pool.putRequest(req) for req in request_pool]
pool.wait()
2、函数多参数的传参方法
def hello(m, n, o):
""""""
print "m = %s, n = %s, o = %s"%(m, n, o)
if __name__ == '__main__':
# 方法1 将多参数解包为列表
lst_vars_1 = ['1', '2', '3']
lst_vars_2 = ['4', '5', '6']
func_var = [(lst_vars_1, None), (lst_vars_2, None)]
# 方法2 将多参数解包为字典
dict_vars_1 = {'m':'1', 'n':'2', 'o':'3'}
dict_vars_2 = {'m':'4', 'n':'5', 'o':'6'}
func_var = [(None, dict_vars_1), (None, dict_vars_2)]
pool = threadpool.ThreadPool(2)
requests = threadpool.makeRequests(hello, func_var)
[pool.putRequest(req) for req in requests]
pool.wait()
参考
链接: https://blog.csdn.net/biggbang/article/details/122547980