import time
from concurrent import futures
def func_test(data):
print("这里是子线程函数")
time.sleep(1)
return data
def call_back_func(future_obj, var=None):
print(future_obj.result())
print("每个子线程执行完成后,会执行该回调函数, 打印var={}".format(var))
if __name__ == '__main__':
data_list = ["a", "b", "c"]
thread_num = min(50, len(data_list))
"""方法一: 使用map函数"""
with futures.ThreadPoolExecutor(thread_num) as executor: # 开启线程池
res_data = executor.map(func_test, data_list, timeout=0.5) # 开启线程(等待所有的子线程任务执行结束,代码才会继续往下执行)
# 如果需要res_data,也就是子线程返回得内容, 则for循环取出所有子线程得返回得值
for i in res_data:
print(i)
"""方法二: 使用submit"""
with futures.ThreadPoolExecutor(thread_num) as executor:
res_list = []
for i in range(2):
future_obj = executor.submit(func_test, 111)
# 线程执行结束后或终止后会执行该回调函数, 自动将future_obj当作函数的第一个参数传给函数
future_obj.add_done_callback(call_back_func)
res_list.append(future_obj) # 将结果对象添加到列表中
for res in res_list:
print(res.result()) # 使用result可以获取函数执行的return结果
"""方法三: 使用wait和submit函数"""
"wait返回值是一个元组,元组里是已完成和未完成的两个集合," \
"它的return_when参数接受3个选项:" \
"ALL_COMPLETED: 意味着所有都完成," \
"FIRST_COMPLETED: 意味着有一个完成了就可以了, " \
"FIRST_EXCEPTION: 是第一个出现异常就会停止wait"
from concurrent.futures import wait
with futures.ThreadPoolExecutor(thread_num) as executor:
res_list = []
for i in range(3):
future_obj = executor.submit(func_test, i)
res_list.append(future_obj)
wait(res_list, return_when='FIRST_EXCEPTION')
print("这里是主线程")
python的进程池,线程池(使用futures库实现)
最新推荐文章于 2024-03-25 12:00:00 发布