程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python獲取線程返回值

編輯:Python

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

python獲取線程返回值的更多相關文章

  1. Callable 獲取線程返回值

    allable與 Future 兩功能是Java在興許版本號中為了適應多並法才增加的,Callable是類似於Runnable的接口,實現Callable接口的類和實現Runnable的類都是可被其它 ...

  2. Python從線程獲取函數返回值

    Python中利用強大的threading模塊可以很容易的實現多線程開發,提高運行速度.這一般是對某個進行大量計算操作的的函數進行多線程處理,然後合並各線程的結果.獲取函數返回值的方法可以如下: 1) ...

  3. Java多線程和並發(四),線程返回值獲取方式和Callable接口

    目錄 1.主線程等待法 2.使用Thread類的join()阻塞當前線程,等待子線程執行完畢 3.通過Callable接口實現:通過FutureTask Or線程池獲取 四.線程返回值獲取方式和Cal ...

  4. python os.system()返回值判斷

    最近遇到os.system()執行系統命令的情況,上網搜集了一下資料,整理如下,以備不時之需,同時也希望能幫到某些人. 一.python中的 os.system(cmd)的返回值與linux命令返回值 ...

  5. 深入Callable及Runnable兩個接口 獲取線程返回結果

    今天碰到一個需要獲取線程返回結果的業務場景,所以了解到了Callable接口. 先來看下下面這個例子: public class ThreadTest { public static void mai ...

  6. Android平台調用Web Service:線程返回值

    接上文 前文中的遺留問題 對於Java多線程的理解,我曾經只局限於實現Runnable接口或者繼承Thread類.然後重寫run()方法.最後start()調用就算完事,可是一旦涉及死鎖以及對共享資源 ...

  7. Python3.x:Selenium+PhantomJS爬取帶Ajax、Js的網頁及獲取JS返回值

    前言 現在很多網站的都大量使用JavaScript,或者使用了Ajax技術.這樣在網頁加載完成後,url雖然不改變但是網頁的DOM元素內容卻可以動態的變化.如果處理這種網頁是還用requests庫或者 ...

  8. ascii#ascii,對象類中找__repr__,獲取其返回值

    #!/usr/bin/env python #ascii,對象類中找__repr__,獲取其返回值 class Foo : def __repr__(self): return "hello ...

  9. Python 基礎之返回值與函數使用與局部變量和全局變量locals() 和 globals()

    一.函數的返回值 return return: 自定義返回值,返回到哪裡? 返回到函數的[調用處]1.return 後面可以跟上六個標准數據類型,除此之外,可以跟上 類對象,函數,如果不寫return ...

  10. C#獲取存儲過程返回值和輸出參數值的方法

    //轉自網絡,先留個底 1.獲取Return返回值 //存儲過程 //Create PROCEDURE MYSQL // @a int, // @b int //AS // return @a + @ ...

隨機推薦

  1. 【py技巧】使用reload重導入修改過的包或模塊

    #使用import導入 import my_module my_module.something() #out - orignal #這裡修改輸出 - changed reload(my_module ...

  2. swift 委托代理傳值

    委托代理 1.定義個協議 2.聲明一個委托代理 3.指定委托代理,調用委托實現的協議方法 4實現LoadingDelegate協議 代碼如下: import UIKit //1.定義個協議 proto ...

  3. MDA系統分析實戰--圖書館管理系統

    MDA系統分析實戰--圖書館管理系統 本文通過MDA系統分析方法,對圖書館管理系統進行分析,簡要敘述系統分析的一般過程.首先,簡要介紹什麼是MDA:MDA(Model-Driven Architect ...

  4. Lambda表達式, 可以讓我們的代碼更優雅.

    在C#中, 適當地使用Lambda表達式, 可以讓我們的代碼更優雅. 通過lambda表達式, 我們可以很方便地創建一個delegate: 下面兩個語句是等價的 Code highlighting p ...

  5. HDU 4081 MST

    這道題在LRJ的書上看到,今天回過頭來繼續看這題,發現很多東西都已經明白了. 題意:有N個城市,每個城市有一個坐標和人口. 現在要建一些邊使得他們都聯通,花費就是這些邊的長度,然後有一條邊可以免費.問 ...

  6. 【玩轉Ubuntu】08. Linux報錯:Syntax error: "(" unexpected解決辦法

    問題: 在MAC上寫了一段shell腳本,放到Ubuntu上運行總是報下面這個錯誤,單步調試都是對的,就是直接運行會報錯. [email protected]:~/package$ sh packag ...

  7. 數字證書中讀取PublicKey

    1. 讀取https簽發證書中的key 1) 在下面的代碼中,是實現讀取證書字符串來讀取key的,CERTIFICATE 就是一個證書的字符串, 而方法cf.generateCertificate() ...

  8. Spring筆記03_AOP

    目錄 1. AOP 1.1 AOP介紹 1.1.1 什麼是AOP 1.1.2 AOP實現原理 1.1.3 AOP術語[掌握] 1.2 AOP的底層實現(了解) 1.2.1 JDK動態代理 1.2.2 ...

  9. Good Time------打卡讓生活更美好

    Section 1團隊介紹 Part 1 隊員信息 姓名 學號 職務 王怡镔 2016012045 組長 於鑫宇 2016012029 組員 張濟噸 2016012072 組員 黃鶴 20160120 ...

  10. vue在body上面綁定enter事件

    mounted () { this.bodyListener = (e) => { if (e.keyCode === 13 && e.target === document.b ...


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved