python獲取多線程及子線程的返回值
最近有個需求,用多線程比較合適,但是我需要每個線程的返回值,這就需要我在threading.Thread的基礎(chǔ)上進(jìn)行封裝
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,不然主線程比子線程跑的快,會拿不到結(jié)果 print t.get_result() et = time.time() print et - st
執(zhí)行結(jié)果
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
元組中的結(jié)果是函數(shù)foo的返回值,至于結(jié)果為什么這么亂,我猜,是因為各子線程foo的print和主線程print get_result()一起搶占系統(tǒng)資源造成。
下面介紹下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])
這是目前最主流的獲取線程數(shù)據(jù)的方法。使用 Queue 庫創(chuàng)建隊列實例,用來儲存和傳遞線程間的數(shù)據(jù)。Python 的隊列是線程安全的,也就是說多個線程同時訪問一個隊列也不會有沖突。Python 隊列有三種 FIFO 先進(jìn)先出,F(xiàn)ILO 先進(jìn)后出(類似棧),優(yōu)先級隊列(由單獨的優(yōu)先級參數(shù)決定順序)。使用隊列可以實現(xiàn)簡單 生產(chǎn)者 – 消費者 模型
總結(jié)
以上所述是小編給大家介紹的python獲取多線程及子線程的返回值,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
一篇文章帶你學(xué)習(xí)Python3的高級特性(1)
這篇文章主要為大家詳細(xì)介紹了Python3的高階函數(shù),主要介紹什么是高級特性,高級特性的用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01Xadmin+rules實現(xiàn)多選行權(quán)限方式(級聯(lián)效果)
這篇文章主要介紹了Xadmin+rules實現(xiàn)多選行權(quán)限方式(級聯(lián)效果),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04一文秒懂python讀寫csv xml json文件各種騷操作
多年來,數(shù)據(jù)存儲的可能格式顯著增加,但是,在日常使用中,還是以 CSV 、 JSON 和 XML 占主導(dǎo)地位。 在本文中,我將與你分享在Python中使用這三種流行數(shù)據(jù)格式及其之間相互轉(zhuǎn)換的最簡單方法,需要的朋友可以參考下2019-07-07