• 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

  • 相关阅读:
    让阿里P8都为之着迷的分布式核心原理解析到底讲了啥?看完我惊了
    基于51单片机的PWM控制马达电机调速正反转
    POI导出Excel设置背景颜色不生效
    JSON数据和解析
    基于 VMware workstation 16 安装 Linux CentOS 8 操作系统(超详细教程)
    多网卡场景数据包接收时ip匹配规则
    SpringBoot的静态资源怎么导入
    flink的安装与使用(ubuntu)
    【PID优化】基于樽海鞘算法PID控制器优化设计含Matlab源码
    logrotate日志打断及打断失败的原因
  • 原文地址:https://www.cnblogs.com/Free-A/p/16531748.html