python獲取執行緒返回值

python獲取執行緒返回值

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

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

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

    • 實現多執行緒

      常用思路為,import Thread 開啟多執行緒並且執行,
      但實際上我需要調用演算法,演算法會返回給我生成的語音長度和語音文件的路徑
      所以要想辦法獲取執行緒返回值,查資料找到了兩種方法

    • 方式一

      • 嘗試

        image-20220720133059527

      • 結果

        image-20220720133124803

        所以可以得知這樣是獲取不到返回值的

        查看源碼

        image-20220720133356334

        start方法並沒有返回值

        image-20220720133515917

        __init__方法中也並沒有存儲結果的屬性

      • 重寫Thread類

        由上面可以知道Thread類中是無法獲取執行緒函數返回值的

        所以要重寫Thread類

        image-20220720134540592

        重新寫了__init__run方法和join方法

        此處問題1:為什麼重寫run方法明明在程式碼中是start方法開啟的

        淺淺研究一下start方法的源碼

        image-20220720135216910

        可以看到,在不會報錯的情況下start方法會調用_start_new_thread方法,參數為_bootstrap,首先查看_start_new_thread方法源碼

        image-20220720135433335

        image-20220720135500259

        雖然沒有程式碼,但是注釋上寫的會call這個傳入function的方法,所以最終是要執行_bootstrap這個方法

        image-20220720140047175

        _bootstrap方法最終調用_bootstrap_inner方法

        image-20220720140151659

        最終就調用到了run方法

        此處問題2:為什麼使用join方法

        執行緒使用join方法會讓主執行緒等待所有子執行緒執行完畢後再繼續向下執行

        所以我們重新寫了join方法,並且在run方法中給對象設置了私有屬性,_return這個屬性的值就是執行緒的執行結果,最後在join方法中return出來

      • 重寫後程式碼

      • image-20220720165515122

      • 結果

        image-20220720165552290

    • 方式二

      使用自帶的concurrent.futures庫

      • 程式碼image-20220720171113033

      • 結果image-20220720171222280

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

    實際應用到項目中去

    項目涉及公司機密,不予展示


    END