多线程系列: concurrent.futures
简单的多线程任务通过concurrent.futures库来管理更加方便,可以参数化控制线程数和简化一些操作。
示例代码
import concurrent.futures
import time
from pprint import pprint
# 定义分类和分割模型函数
def classify_model_1(image_path, result_dict):
# 模拟分类操作
time.sleep(1)
print("classify_model_1")
result_dict[f"模型1分类结果_{image_path}"] = f"模型1分类结果: {image_path}"
def classify_model_2(image_path, result_dict):
# 模拟分类操作
time.sleep(1)
print("classify_model_2")
result_dict[f"模型2分类结果_{image_path}"] = f"模型2分类结果: {image_path}"
def segment_model_1(image_path, result_dict):
# 模拟分割操作
time.sleep(1)
print("segment_model_1")
result_dict[f"模型1分割结果_{image_path}"] = f"模型1分割结果: {image_path}"
def segment_model_2(image_path, result_dict):
# 模拟分割操作
time.sleep(1)
print("segment_model_2")
result_dict[f"模型2分割结果_{image_path}"] = f"模型2分割结果: {image_path}"
# 线程执行函数
def process_image(image_path, result_dict, result_key):
# 使用 ThreadPoolExecutor 来创建分类模型和分割模型的线程
with ThreadPoolExecutor(max_workers=4) as executor:
futures = [
executor.submit(classify_model_1, image_path, result_dict),
executor.submit(classify_model_2, image_path, result_dict),
executor.submit(segment_model_1, image_path, result_dict),
executor.submit(segment_model_2, image_path, result_dict)
]
# 等待所有分类模型线程完成
for future in futures:
future.result()
# 主函数
if __name__ == "__main__":
tic = time.time()
# 假设我们有一个图像路径列表
image_paths = [
"image1.jpg",
"image2.jpg",
]
result_dict = {}
with ThreadPoolExecutor(max_workers=2) as executor:
threads = [
executor.submit(process_image, image_path, result_dict, i)
for i, image_path in enumerate(image_paths)
]
# 等待所有线程完成
for future in as_completed(threads):
future.result()
# 输出结果
for key, value in result_dict.items():
pprint(value)
toc = time.time()
run_time = toc - tic
print("程序运行时间:", run_time)
结果示例
# segment_model_1
# classify_model_2
# segment_model_2
# segment_model_1
# segment_model_2
# classify_model_1
# classify_model_2
# classify_model_1
# '模型1分割结果: image2.jpg'
# '模型2分类结果: image2.jpg'
# '模型2分割结果: image1.jpg'
# '模型1分割结果: image1.jpg'
# '模型2分割结果: image2.jpg'
# '模型1分类结果: image2.jpg'
# '模型2分类结果: image1.jpg'
# '模型1分类结果: image1.jpg'
# 程序运行时间: 1.1142146587371826