多线程系列:自定义多线程类获取函数返回值

多线程系列:自定义多线程类获取函数返回值

自定义多线程类参考博客: https://blog.csdn.net/xpt211314/article/details/109543014.

这里展示的多线程示例包括:

  1. 子线程包括多线程的情况
  2. 计算子线程耗时情况
  3. 多个线程对应一一对应不同的函数情况
  4. 多个线程对应同一个函数,只是输入参数不一样情况。

代码示例

python 复制代码
import threading
import time
from pprint import pprint


class MyThread(threading.Thread):
    def __init__(self, target, args=()):
        super(MyThread, self).__init__()
        self.func = target
        self.args = args
    def run(self):
        self.result = self.func(*self.args)
    def get_result(self):
        threading.Thread.join(self)  # 等待线程执行完毕
        try:
            return self.result
        except Exception as e:
            return e


# 定义分类模型函数
def classify_model_1(image_path):
    # 模拟分类操作
    time.sleep(1)
    print("classify_model_1")

    return {f"模型1_{image_path}分类结果": image_path}

def classify_model_2(image_path):
    # 模拟分类操作
    time.sleep(1)
    print("classify_model_2")

    return {f"模型2_{image_path}分类结果": image_path}

def classify_model_3(image_path):
    # 模拟分类操作
    time.sleep(1)
    print("classify_model_3")

    return {f"模型3_{image_path}分类结果": image_path}

def classify_model_4(image_path):
    # 模拟分类操作
    time.sleep(1)
    print("classify_model_4")

    return {f"模型4_{image_path}分类结果": image_path}

def classify_model_5(image_path):
    # 模拟分类操作
    time.sleep(1)
    print("classify_model_5")

    return {f"模型5_{image_path}分类结果": image_path}



# 定义分割模型函数
def segment_model_1(image_path):
    # 模拟分割操作
    time.sleep(1)
    print("segment_model_1")

    return {f"模型1_{image_path}分割结果": image_path}


def segment_model_2(image_path):
    # 模拟分割操作
    time.sleep(1)
    print("segment_model_2")

    return {f"模型2_{image_path}分割结果": image_path}

def segment_model_3(image_path):
    # 模拟分割操作
    time.sleep(1)
    print("segment_model_3")

    return {f"模型3_{image_path}分割结果": image_path}

def segment_model_4(image_path):
    # 模拟分割操作
    time.sleep(1)
    print("segment_model_4")

    return {f"模型4_{image_path}分割结果": image_path}

def segment_model_5(image_path):
    # 模拟分割操作
    time.sleep(1)
    print("segment_model_5")

    return {f"模型5_{image_path}分割结果": image_path}


def process_image(image_path):
    # 创建线程列表
    model_thread_list = [
        MyThread(classify_model, args=(image_path,)) 
        for classify_model in [
          classify_model_1, classify_model_2, classify_model_3, 
          classify_model_4, classify_model_5
        ]
    ]
    model_thread_list.extend([
        MyThread(segment_model, args=(image_path,))
        for segment_model in [
          segment_model_1, segment_model_2, segment_model_3,
          segment_model_4, segment_model_5
        ]
    ])
    start_time_dict = {}
    run_time_dict = {}
    # 启动线程
    for t in model_thread_list:
        t.start()
        start_time_dict[t.ident] = time.time()

    # 等待所有线程完成
    for t in model_thread_list:
        t.join()
        run_time_dict[t.ident] = time.time() - start_time_dict[t.ident]

    # 获取结果
    model_result_dict = {}
    for t in model_thread_list:
      model_result_dict.update(t.get_result()) 
    # print(results)
    model_result_dict.update(run_time_dict)

    return model_result_dict


if __name__ == '__main__':
    tic = time.time()
    image_path_list = [
      "image1.jpg",
      "image2.jpg",
    ]
    image_thread_list = [
      MyThread(process_image, args=(image_path,))
      for image_path in image_path_list 
    ]
    for t in image_thread_list: 
      t.start()
    result_dict = {}
    for t in image_thread_list:
        t.join()
        result_dict.update(t.get_result())

    pprint(result_dict)
    toc = time.time()
    print("程序运行时间:", toc - tic)

结果示例

python 复制代码
# segment_model_2
# segment_model_5
# segment_model_2
# segment_model_1
# segment_model_1
# segment_model_3
# segment_model_4
# classify_model_5
# segment_model_4
# segment_model_5
# segment_model_3
# classify_model_3
# classify_model_2
# classify_model_3
# classify_model_4
# classify_model_1
# classify_model_1
# classify_model_2
# classify_model_5
# classify_model_4
# {88328: 1.0205564498901367,
#  110924: 1.0205564498901367,
#  132612: 1.0205564498901367,
#  139284: 1.0205564498901367,
#  140332: 1.0205564498901367,
#  140392: 1.0205564498901367,
#  140404: 1.0205564498901367,
#  140756: 1.0205564498901367,
#  140920: 1.0205564498901367,
#  141028: 1.0205564498901367,
#  141076: 1.0205564498901367,
#  141252: 1.0205564498901367,
#  141416: 1.0205564498901367,
#  141628: 1.0205564498901367,
#  141964: 1.0205564498901367,
#  142716: 1.0205564498901367,
#  143008: 1.0205564498901367,
#  143148: 1.0205564498901367,
#  143312: 1.0205564498901367,
#  144176: 1.0205564498901367,
#  '模型1_image1.jpg分割结果': 'image1.jpg',
#  '模型1_image1.jpg分类结果': 'image1.jpg',
#  '模型1_image2.jpg分割结果': 'image2.jpg',
#  '模型1_image2.jpg分类结果': 'image2.jpg',
#  '模型2_image1.jpg分割结果': 'image1.jpg',
#  '模型2_image1.jpg分类结果': 'image1.jpg',
#  '模型2_image2.jpg分割结果': 'image2.jpg',
#  '模型2_image2.jpg分类结果': 'image2.jpg',
#  '模型3_image1.jpg分割结果': 'image1.jpg',
#  '模型3_image1.jpg分类结果': 'image1.jpg',
#  '模型3_image2.jpg分割结果': 'image2.jpg',
#  '模型3_image2.jpg分类结果': 'image2.jpg',
#  '模型4_image1.jpg分割结果': 'image1.jpg',
#  '模型4_image1.jpg分类结果': 'image1.jpg',
#  '模型4_image2.jpg分割结果': 'image2.jpg',
#  '模型4_image2.jpg分类结果': 'image2.jpg',
#  '模型5_image1.jpg分割结果': 'image1.jpg',
#  '模型5_image1.jpg分类结果': 'image1.jpg',
#  '模型5_image2.jpg分割结果': 'image2.jpg',
#  '模型5_image2.jpg分类结果': 'image2.jpg'}
# 程序运行时间: 1.0205564498901367
相关推荐
综合资讯6 分钟前
2026年打开设备ETF的产品清单:八只同类,两只能买
人工智能·科技·芯片·半导体·科创
声讯电子7 分钟前
A-59 双麦双通道语音处理模块:重新定义全双工通话的极限性能
人工智能·语音识别·ai降噪·usb接口·回音消除
菜鸟‍10 分钟前
【论文学习】Frontiers in Physics 2024 || Cap2Seg:基于文本描述生成的 COVID-19 医学图像分割性能提升方法
人工智能·学习
陕西企来客11 分钟前
生成式引擎优化(GEO)行业白皮书:从流量分配到认知占有的战略跃迁
人工智能·算法·机器学习·技术好geo优化
梦想的颜色13 分钟前
飞书 CLI + Skill 完全硬核指南|让 AI Agent 全自动操控飞书(消息 / 文档 / 日历 / 多维表)
人工智能·飞书·办公自动化·飞书 skill·飞书全自动工作流·agent 工具集成
蓝速科技18 分钟前
蓝速科技丨 AI 双屏翻译机:动静双模解放双手的商务沟通实测
人工智能·科技
武子康22 分钟前
VLA 已经能输出动作,为什么机器人仍需要多时间尺度闭环
人工智能·机器人·agent
阿里云云原生27 分钟前
AI Agent 上线容易稳定难?阿里云 AgentLoop 推出“经验自进化”闭环治理方案
人工智能·阿里云·mybatis·agentscope
CodexDave28 分钟前
Python 自动化接单实战(一):把 CSV 需求做成配置驱动解析器
java·python·自动化·json·数据清洗·python自动化·csv处理
魔力女仆32 分钟前
【RUST AI】把 TTS 搬进浏览器:kokoroi-rs 的 WASM 实践
人工智能·rust·wasm