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方法
        因为run方法的源码较少,比较容易重写,所以选择重写run方法
        20220909151026

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

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

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

      • 重写后代码

      • image-20220720165515122

      • 结果

        image-20220720165552290

    • 方式二

      使用自带的concurrent.futures库

      • 代码image-20220720171113033

      • 结果image-20220720171222280

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


    END

posted @ 2022-07-29 11:41  Free_A  阅读(1739)  评论(0编辑  收藏  举报