最近有個需求,用多線程比較合適,但是我需要每個線程的返回值,這就需要我在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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

