python获取线程返回值

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

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

  1. 首先判断这种思路是否可行
  • 实现多线程
    常用思路为,import Thread 开启多线程并且执行,
    但实际上我需要调用算法,算法会返回给我生成的语音长度和语音文件的路径
    所以要想办法获取线程返回值,查资料找到了两种方法
  • 方式一
  • 尝试
  • 结果

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

查看源码

python带返回值多线程 python多线程返回值怎么获取_thread

start方法并没有返回值

python带返回值多线程 python多线程返回值怎么获取_thread_02

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

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

重新写了__init__run方法和join方法

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

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

python带返回值多线程 python多线程返回值怎么获取_futures_03

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

python带返回值多线程 python多线程返回值怎么获取_futures_04

python带返回值多线程 python多线程返回值怎么获取_python_05

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

python带返回值多线程 python多线程返回值怎么获取_threading_06

_bootstrap方法最终调用_bootstrap_inner方法

python带返回值多线程 python多线程返回值怎么获取_thread_07

最终就调用到了run方法

因为run方法的源码较少,比较容易复现,所以选择重写run方法

python带返回值多线程 python多线程返回值怎么获取_threading_08

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

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

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

  • 重写后代码
  • 结果
  • 方式二
    使用自带的concurrent.futures库
  • 代码
  • python带返回值多线程 python多线程返回值怎么获取_thread_09

  • 结果
  • python带返回值多线程 python多线程返回值怎么获取_线程_10

  1. 可以看出,这两种方法都行,所以我们选择第二种更为方便的方法
    实际应用到项目中去
    项目涉及公司机密,不予展示