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方法
此處問題2:為什麼使用join方法
執行緒使用join方法會讓主執行緒等待所有子執行緒執行完畢後再繼續向下執行
所以我們重新寫了join方法,並且在run方法中給對象設置了私有屬性,
_return這個屬性的值就是執行緒的執行結果,最後在join方法中return出來 -
重寫後程式碼
-

-
結果

-
-
方式二
使用自帶的concurrent.futures庫
-
程式碼

-
結果

-
-
-
可以看出,這兩種方法都行,所以我們選擇第二種更為方便的方法
實際應用到項目中去
項目涉及公司機密,不予展示
END
















