国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

python使用threading獲取線程函數(shù)返回值的實(shí)現(xiàn)方法

2020-02-16 10:43:59
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

threading用于提供線程相關(guān)的操作,線程是應(yīng)用程序中工作的最小單元。python當(dāng)前版本的多線程庫(kù)沒(méi)有實(shí)現(xiàn)優(yōu)先級(jí)、線程組,線程也不能被停止、暫停、恢復(fù)、中斷。

threading模塊提供的類(lèi): 

  Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer, local。

threading 模塊提供的常用方法:

  threading.currentThread(): 返回當(dāng)前的線程變量。

  threading.enumerate(): 返回一個(gè)包含正在運(yùn)行的線程的list。正在運(yùn)行指線程啟動(dòng)后、結(jié)束前,不包括啟動(dòng)前和終止后的線程。

  threading.activeCount(): 返回正在運(yùn)行的線程數(shù)量,與len(threading.enumerate())有相同的結(jié)果。

threading 模塊提供的常量:

  threading.TIMEOUT_MAX 設(shè)置threading全局超時(shí)時(shí)間。

好了,正文開(kāi)始:

最近需要用python寫(xiě)一個(gè)環(huán)境搭建工具,多線程并行對(duì)環(huán)境各個(gè)部分執(zhí)行一些操作,并最終知道這些并行執(zhí)行的操作是否都執(zhí)行成功了,也就是判斷這些操作函數(shù)的返回值是否為0。但是threading并沒(méi)有顯式的提供獲取各個(gè)線程函數(shù)返回值的方法,只好自己動(dòng)手,下面就介紹一下自己的實(shí)現(xiàn)方式。

一開(kāi)始考慮到執(zhí)行的操作可能有很多,而且后續(xù)會(huì)不斷補(bǔ)充,因此先寫(xiě)了一個(gè)通用的多線程執(zhí)行類(lèi),封裝線程操作的基本方法,如下:

import threadingclass MyThread(object):  def __init__(self, func_list=None):  #所有線程函數(shù)的返回值匯總,如果最后為0,說(shuō)明全部成功    self.ret_flag = 0    self.func_list = func_list    self.threads = []  def set_thread_func_list(self, func_list):    """    @note: func_list是一個(gè)list,每個(gè)元素是一個(gè)dict,有func和args兩個(gè)參數(shù)    """    self.func_list = func_list  def start(self):    """    @note: 啟動(dòng)多線程執(zhí)行,并阻塞到結(jié)束    """    self.threads = []    self.ret_flag = 0    for func_dict in self.func_list:      if func_dict["args"]:        t = threading.Thread(target=func_dict["func"], args=func_dict["args"])      else:        t = threading.Thread(target=func_dict["func"])      self.threads.append(t)    for thread_obj in self.threads:      thread_obj.start()    for thread_obj in self.threads:      thread_obj.join()  def ret_value(self):    """    @note: 所有線程函數(shù)的返回值之和,如果為0那么表示所有函數(shù)執(zhí)行成功    """    return self.ret_flag

MyThread類(lèi)會(huì)接受一個(gè)func_list參數(shù),每個(gè)元素是一個(gè)dict,有func和args兩個(gè)key,func是真正要執(zhí)行的函數(shù)引用,args是函數(shù)的參數(shù)。其中最主要的方法是start方法,會(huì)多線程執(zhí)行每個(gè)func,然后一直等到所有線程都執(zhí)行結(jié)束后退出。接下來(lái)的關(guān)鍵就是如何對(duì)self.ret_flag設(shè)置正確的值,以判斷所有的線程函數(shù)是否都返回0了。

我的實(shí)現(xiàn)是,在MyThread class中寫(xiě)一個(gè)方法trace_func,作為直接的線程函數(shù),這個(gè)trace_func中執(zhí)行真正需要執(zhí)行的函數(shù),從而可以獲取到該函數(shù)的返回值,設(shè)置給self.ret_flag。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 藁城市| 渝北区| 黄石市| 鹿泉市| 昌宁县| 昌平区| 华亭县| 石阡县| 南宁市| 鹰潭市| 漳浦县| 西贡区| 江源县| 城步| 龙陵县| 澄迈县| 本溪| 北票市| 威海市| 新民市| 万州区| 余姚市| 克山县| 平遥县| 岳池县| 攀枝花市| 浦东新区| 华池县| 炉霍县| 来宾市| 丹阳市| 海口市| 北宁市| 洪湖市| 津市市| 新民市| 墨江| 泸定县| 新龙县| 新泰市| 大田县|