前言
工作中的需求
將前端傳過來的字串資訊通過演演算法轉換成語音,並將語音檔案返回回去
由於演演算法不是我寫的,只需要呼叫即可,但是演演算法執行速度相當緩慢
我的優化思路是,將前端的字串按照句號分割,開啟相等長度的執行緒池,並行執行演演算法
首先判斷這種思路是否可行
實現多執行緒
常用思路為,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