首页 > 其他分享 >多线程系列:线程中包含子线程

多线程系列:线程中包含子线程

时间:2024-08-09 10:53:52浏览次数:17  
标签:系列 image queue 线程 time model 多线程 segment classify

多线程系列:线程中包含子线程

这里展示的多线程基本包含了常见的多线程操作:

  1. 实现线程中包含子线程;
  2. 计算子线程耗时
  3. 展示一个函数如何通过参数传递进行多线程
  4. 一个线程调用一个函数的情况

代码示例

import threading
import time
from pprint import pprint
import queue



# 假设以下是二个分类模型函数
def classify_model_1(image_path, queue):
    # 模拟分类操作
    time.sleep(1)
    print("classify_model_1")
    # return f"模型1分类结果: {image_path}"
    queue.put(f"模型1分类结果: {image_path}")


def classify_model_2(image_path, queue):
    # 模拟分类操作
    time.sleep(1)
    print("classify_model_2")
    # return f"模型2分类结果: {image_path}"
    queue.put(f"模型2分类结果: {image_path}")


# 假设以下是二个分割模型函数
def segment_model_1(image_path, queue):
    # 模拟分割操作
    time.sleep(1)
    print("segment_model_1")
    # return f"模型1分割结果: {image_path}"
    queue.put(f"模型1分割结果: {image_path}")


def segment_model_2(image_path, queue):
    # 模拟分割操作
    time.sleep(1)
    print("segment_model_2")
    # return f"模型2分割结果: {image_path}"
    queue.put(f"模型2分割结果: {image_path}")


# 线程执行函数
def process_image(image_path, result_dict, result_key):
    # 创建用于线程间通信的队列
    classify_queue = queue.Queue()
    segment_queue = queue.Queue()

    # 创建分类模型和分割模型的线程
    classify_threads = [
        threading.Thread(target=classify_model_1, args=(image_path, classify_queue)),
        threading.Thread(target=classify_model_2, args=(image_path, classify_queue))
    ]
    segment_threads = [
        threading.Thread(target=segment_model_1, args=(image_path, segment_queue)),
        threading.Thread(target=segment_model_2, args=(image_path, segment_queue))
    ]
    start_time_dict = {}
    run_time_dict = {}
    # 启动所有线程
    for t in classify_threads + segment_threads:
        t.start()
        start_time_dict[t.ident] = time.time()

    # 等待所有分类模型线程完成并记录结束时间
    for t in classify_threads:
        t.join()
        run_time_dict[t.ident] = time.time() - start_time_dict[t.ident]

    # 等待所有分割模型线程完成并记录结束时间
    for t in segment_threads:
        t.join()
        run_time_dict[t.ident] = time.time() - start_time_dict[t.ident]

    # 收集所有分类和分割模型的结果
    classify_results = []
    while not classify_queue.empty():
        classify_results.append(classify_queue.get())

    segment_results = []
    while not segment_queue.empty():
        segment_results.append(segment_queue.get())

    # 将结果存储在共享字典中
    result_dict[result_key] = (classify_results, segment_results, run_time_dict)

# 主函数
if __name__ == "__main__":
    tic = time.time()
    # 假设我们有一个图像路径列表
    image_paths = [
        "image1.jpg",
        "image2.jpg",
    ]
    result_dict = {}
    threads = []
    for i, image_path in enumerate(image_paths):
        t = threading.Thread(target=process_image, args=(image_path, result_dict, i))
        threads.append(t)
        t.start()

    # 等待所有线程完成
    for t in threads:
        t.join()
    # 输出结果
    for key, value in result_dict.items():
        pprint(value)




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

结果示例

# classify_model_1
# classify_model_2
# classify_model_1
# classify_model_2
# segment_model_1
# segment_model_2
# segment_model_1
# segment_model_2
# (['模型1分类结果: image2.jpg', '模型2分类结果: image2.jpg'],
#  ['模型2分割结果: image2.jpg', '模型1分割结果: image2.jpg'],
#  {201612: 1.0070557594299316,
#   204744: 1.0125854015350342,
#   205424: 1.0160560607910156,
#   207048: 1.0160560607910156})
# (['模型1分类结果: image1.jpg', '模型2分类结果: image1.jpg'],
#  ['模型1分割结果: image1.jpg', '模型2分割结果: image1.jpg'],
#  {204448: 0.9758126735687256,
#   206648: 0.9813151359558105,
#   207700: 1.0226755142211914,
#   207812: 1.0472991466522217})
# 程序运行时间: 1.266035556793213

标签:系列,image,queue,线程,time,model,多线程,segment,classify
From: https://blog.csdn.net/familytaijun/article/details/141036431

相关文章

  • 多进程系列:不同的模型处理不同的数据
    多进程系列:不同的模型处理不同的数据代码示例importmultiprocessingimporttime#假设以下是五个分类模型函数defclassify_model_1(data):#模拟分类操作time.sleep(1)print("classify_model_1")returnf"模型1分类结果:{data}"defcl......
  • 多线程学习总结
    Java多线程学习总结本章目标理解线程的基本概念理解线程与进程的区别熟悉线程的实现方式了解线程的管理熟悉线程的生命周期掌握线程同步掌握线程池了解线程通信掌握线程定时器什么是进程进程就是正在运行的程序,它是系统进行资源分配和调度的基本单位,各个进程之间......
  • 【Playwright+Python】系列教程(八)鉴权Authentication的使用
    写在前面还是有些絮叨的感觉,官方翻译和某些博主写那个玩楞,基本都是软件直接翻译后的产物。读起来生硬不说,甚至有的时候不到是什么意思,真的是实在不敢恭维。到底是什么意思?就是你已经登陆过一次,在Session、Cookie未失效的情况下,登录过一次后,下次就不用再走一遍登录的过程,从而缩......
  • mysql系列之事务(三)
    1.为什么需要事务首先我们要知道什么是事务:事务(Transaction)是‌数据库系统中执行的一个工作单位,它是由用户定义的一组操作序列。一个事务可以是一组‌SQL语句、一条SQL语句或整个程序,一个应用程序可以包括多个事务。通俗易懂来说就是,我们在执行一个操作时,要保证要么都成......
  • 没闲着系列 22
    最近下班后,时间还是比较宽松的,相对宽松。今天更新一下TaskSaas近期有什么变动:一个就是概览dashboard以及需求、问题的选择中,加入了ALLTODODONE的分类,更便于查询全部、待做(新建、重新打开、进行中、待反馈)、已完成的分类。第二个是修复了工作台里的一系列bug。因为之前问题......
  • Java多线程编程中的常见问题及优化策略
    Java多线程编程中的常见问题及优化策略大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!多线程的基本概念在Java中,多线程是指程序中可以同时运行多个线程,每个线程可以执行不同的任务。多线程可以提高程序的执行效率,但同时也带来了一些挑战。线程安全......
  • 「Android面试」Android 子线程为什么直接更新UI?
    本文将从子线程不能更新UI的直接原因、根本原因、Android如何做到限制以及子线程该如何正确更新UI四个方向回答问题。【直接原因】在子线程中更新UI会怎样?程序会出现以下错误:Onlytheoriginalthreadthatcreatedaviewhierarchycantouchitsviews. 【根本原因......
  • ignite系列之20-数据源扩展GaussDB
    其它内容参见ignite系列之19-数据源扩展Postgresql publicStringloadCacheSelectRangeQuery(StringfullTblName,Collection<String>keyCols){Stringcols=mkString(keyCols,",");Stringcondition=DataSourceUtils.getCondition(fullTblName);ret......
  • YOLO系列:从yolov1至yolov8的进阶之路 持续更新中
    一、基本概念1.YOLO简介YOLO(YouOnlyLookOnce):是一种基于深度神经网络的对象识别和定位算法,其最大的特点是运行速度很快,可以用于实时系统。2.目标检测算法RCNN:该系列算法实现主要为两个步骤:先从图片中搜索出一些可能存在对象的候选区(SelectiveSearch),大概2000个左右;然后......
  • ignite系列之19-数据源扩展Postgresql
    storeFactory.setDialect(dialect);storeFactory.setDataSourceFactory(newDefaultDataSourceFactory((Object)null));storeFactory.setCacheName(igniteTable.tableName());importjavax.cache.configuration.Factory;publicclassDefaultDataSourceFactory<T>impl......