python獲取執行緒返回值

2022-07-29 12:00:19

python獲取執行緒返回值

前言
工作中的需求
將前端傳過來的字串資訊通過演演算法轉換成語音,並將語音檔案返回回去
由於演演算法不是我寫的,只需要呼叫即可,但是演演算法執行速度相當緩慢

我的優化思路是,將前端的字串按照句號分割,開啟相等長度的執行緒池,並行執行演演算法

  1. 首先判斷這種思路是否可行

    • 實現多執行緒

      常用思路為,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庫

      • 程式碼

      • 結果

  2. 可以看出,這兩種方法都行,所以我們選擇第二種更為方便的方法

    實際應用到專案中去

    專案涉及公司機密,不予展示


    END