• python获取线程返回值


    python获取线程返回值

    前言
    工作中的需求
    将前端传过来的字符串信息通过算法转换成语音,并将语音文件返回回去
    由于算法不是我写的,只需要调用即可,但是算法执行速度相当缓慢

    我的优化思路是,将前端的字符串按照句号分割,开启相等长度的线程池,并发执行算法

    1. 首先判断这种思路是否可行

      • 实现多线程

        常用思路为,import Thread 开启多线程并且执行,
        但实际上我需要调用算法,算法会返回给我生成的语音长度和语音文件的路径
        所以要想办法获取线程返回值,查资料找到了两种方法

      • 方式一

        • 尝试

          image-20220720133059527

        • 结果

          image-20220720133124803

          所以可以得知这样是获取不到返回值的

          查看源码

          image-20220720133356334

          start方法并没有返回值

          image-20220720133515917

          __init__方法中也并没有存储结果的属性

        • 重写Thread类

          由上面可以知道Thread类中是无法获取线程函数返回值的

          所以要重写Thread类

          image-20220720134540592

          重新写了__init__run方法和join方法

          此处问题1:为什么重写run方法明明在代码中是start方法开启的

          浅浅研究一下start方法的源码

          image-20220720135216910

          可以看到,在不会报错的情况下start方法会调用_start_new_thread方法,参数为_bootstrap,首先查看_start_new_thread方法源码

          image-20220720135433335

          image-20220720135500259

          虽然没有代码,但是注释上写的会call这个传入function的方法,所以最终是要执行_bootstrap这个方法

          image-20220720140047175

          _bootstrap方法最终调用_bootstrap_inner方法

          image-20220720140151659

          最终就调用到了run方法

          此处问题2:为什么使用join方法

          线程使用join方法会让主线程等待所有子线程执行完毕后再继续向下执行

          所以我们重新写了join方法,并且在run方法中给对象设置了私有属性,_return这个属性的值就是线程的执行结果,最后在join方法中return出来

        • 重写后代码

        • image-20220720165515122

        • 结果

          image-20220720165552290

      • 方式二

        使用自带的concurrent.futures库

        • 代码image-20220720171113033

        • 结果image-20220720171222280

    2. 可以看出,这两种方法都行,所以我们选择第二种更为方便的方法

      实际应用到项目中去

      项目涉及公司机密,不予展示


      END

  • 相关阅读:
    数据结构错题总结(选择题+填空题)
    【VictoriaMetrics】单机版配置
    vue3+ts打开echarts的正确方式
    【力客热题HOT100】-【039】98 验证二叉搜索树
    增强分析在百度统计的实践
    Wireshark数据抓包分析之HTTP协议
    GIS工具maptalks开发手册(四)02——渲染地图信息框之添加绘制工具 & 获取面的坐标数据信息框进行展示 & 渲染图片的两种方式
    Servlet生命周期
    Unity C# 网络学习(十二)——Protobuf生成协议
    metaRTC7集成lvgl ui demo编译指南
  • 原文地址:https://www.cnblogs.com/Free-A/p/16531748.html