python获取线程返回值
python获取线程返回值
前言
工作中的需求
将前端传过来的字符串信息通过算法转换成语音,并将语音文件返回回去
由于算法不是我写的,只需要调用即可,但是算法执行速度相当缓慢
我的优化思路是,将前端的字符串按照句号分割,开启相等长度的线程池,并发执行算法
-
首先判断这种思路是否可行
-
实现多线程
常用思路为,import Thread 开启多线程并且执行,
但实际上我需要调用算法,算法会返回给我生成的语音长度和语音文件的路径
所以要想办法获取线程返回值,查资料找到了两种方法 -
方式一
-
尝试
-
结果
所以可以得知这样是获取不到返回值的
查看源码
start方法并没有返回值
在
__init__
方法中也并没有存储结果的属性 -
重写Thread类
由上面可以知道Thread类中是无法获取线程函数返回值的
所以要重写Thread类
重新写了
__init__
、run
方法和join
方法此处问题1:为什么重写run方法明明在代码中是start方法开启的
浅浅研究一下start方法的源码
可以看到,在不会报错的情况下start方法会调用
_start_new_thread
方法,参数为_bootstrap
,首先查看_start_new_thread
方法源码虽然没有代码,但是注释上写的会call这个传入function的方法,所以最终是要执行
_bootstrap
这个方法_bootstrap
方法最终调用_bootstrap_inner
方法最终就调用到了run方法
因为run方法的源码较少,比较容易重写,所以选择重写run方法
此处问题2:为什么使用join方法
线程使用join方法会让主线程等待所有子线程执行完毕后再继续向下执行
所以我们重新写了join方法,并且在run方法中给对象设置了一个属性,
_return
这个属性的值就是线程的执行结果,最后在join方法中return出来 -
重写后代码
-
结果
-
-
方式二
使用自带的concurrent.futures库
-
代码
-
结果
-
-
-
可以看出,这两种方法都行,所以我们选择第二种更为方便的方法
END