python 线程池threadpool,函数多参数并获取回调参数

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值