日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

python獲取多線程及子線程的返回值

系統 1956 0

最近有個需求,用多線程比較合適,但是我需要每個線程的返回值,這就需要我在threading.Thread的基礎上進行封裝

            
import threading
class MyThread(threading.Thread):
 def __init__(self,func,args=()):
  super(MyThread,self).__init__()
  self.func = func
  self.args = args
 def run(self):
  self.result = self.func(*self.args)
 def get_result(self):
  try:
   return self.result # 如果子線程不使用join方法,此處可能會報沒有self.result的錯誤
  except Exception:
   return None
def foo(a,b,c):
 time.sleep(1)
 print a*2,b*2,c*2,
 return a*2,b*2,c*2
st = time.time()
li = []
for i in xrange(4):
 t = MyThread(foo,args=(i,i+1,i+2))
 li.append(t)
 t.start()
for t in li:
 t.join() # 一定要join,不然主線程比子線程跑的快,會拿不到結果
 print t.get_result()
et = time.time()
print et - st
          

執行結果

            
0 2 4 (0, 2, 4)
4 6 8 2 4 6 (2, 4, 6)
(4, 6, 8)
6 8 10 (6, 8, 10)
1.00200009346
          

元組中的結果是函數foo的返回值,至于結果為什么這么亂,我猜,是因為各子線程foo的print和主線程print get_result()一起搶占系統資源造成。

下面介紹下python獲得子線程的返回值,具體代碼如下所示:

            
import sys 
import threading 
import Queue 
q = Queue.Queue() 
def worker1(x, y): 
 func_name = sys._getframe().f_code.co_name 
 print "%s run ..." % func_name 
 q.put((x + y, func_name)) 
def worker2(x, y): 
 func_name = sys._getframe().f_code.co_name 
 print "%s run ...." % func_name 
 q.put((x - y, func_name)) 
if __name__ == '__main__': 
 result = list() 
 t1 = threading.Thread(target=worker1, name='thread1', args=(10, 5, )) 
 t2 = threading.Thread(target=worker2, name='thread2', args=(20, 1, )) 
 print '-' * 50 
 t1.start() 
 t2.start() 
 t1.join() 
 t2.join() 
 while not q.empty(): 
  result.append(q.get()) 
 for item in result: 
  if item[1] == worker1.__name__: 
   print "%s 's return value is : %s" % (item[1], item[0]) 
  elif item[1] == worker2.__name__: 
   print "%s 's return value is : %s" % (item[1], item[0]) 
          

這是目前最主流的獲取線程數據的方法。使用 Queue 庫創建隊列實例,用來儲存和傳遞線程間的數據。Python 的隊列是線程安全的,也就是說多個線程同時訪問一個隊列也不會有沖突。Python 隊列有三種 FIFO 先進先出,FILO 先進后出(類似棧),優先級隊列(由單獨的優先級參數決定順序)。使用隊列可以實現簡單 生產者 ?C 消費者 模型

總結

以上所述是小編給大家介紹的python獲取多線程及子線程的返回值,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 永顺县| 特克斯县| 嘉义县| 常熟市| 华宁县| 遂宁市| 龙游县| 桦南县| 同德县| 玛多县| 靖远县| 海淀区| 白水县| 安阳市| 锦州市| 阳东县| 陈巴尔虎旗| 云安县| 河津市| 南乐县| 澳门| 赤壁市| 东安县| 福贡县| 南投县| 云和县| 湄潭县| 荔波县| 金川县| 桐梓县| 营山县| 绥江县| 玉溪市| 莱芜市| 柳州市| 沽源县| 阳原县| 珠海市| 平陆县| 吴川市| 汉沽区|