以下是多線程獲取返回值的一種實現方式
# -*-coding:utf-8-*- from time import ctime, sleep import threading import numpy as np import collections loops = ['廣州', '北京'] t_list = ['01', '02', '03'] cldas_sum = collections.deque() class MyThread(threading.Thread): def __init__(self, func, args, name=''): threading.Thread.__init__(self) self.name = name self.func = func self.args = args self.result = self.func(*self.args) def get_result(self): try: return self.result except Exception: return None def loop(nloop): for j in t_list: cldas_values = [] for k in range(4): cldas_value = nloop + str(k) cldas_values.append(cldas_value) cldas_values.append(j) cldas_values.append(nloop) cldas_sum.append(cldas_values) print(id(cldas_values)) #print(cldas_sum) return cldas_sum def main(): print('start at', ctime()) threads = [] nloops = range(len(loops)) for i in nloops: t = MyThread(loop, (loops[i],), loop.__name__) threads.append(t) for i in nloops: # start threads 此處並不會執行線程,而是將任務分發到每個線程,同步線程。等同步完成后再開始執行start方法 threads[i].start() for i in nloops: # jion()方法等待線程完成 threads[i].join() print(threads[1].get_result()) print('DONE AT:', ctime()) if __name__ == '__main__': main()
需要注意的是:
如果多個線程共用一個公共數據,那么我們需要做的就是將這個公共數據設置成隊列格式,要不然多個線程共同訪問這個數據可能會出錯,需要加鎖。設置成隊列比加鎖再放鎖效率高多了