金狮镖局 Design By www.egabc.com
最近有个需求,用多线程比较合适,但是我需要每个线程的返回值,这就需要我在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 先进后出(类似栈),优先级队列(由单独的优先级参数决定顺序)。使用队列可以实现简单 生产者 – 消费者 模型
总结
以上所述是小编给大家介绍的python获取多线程及子线程的返回值,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
金狮镖局 Design By www.egabc.com
金狮镖局
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
金狮镖局 Design By www.egabc.com
暂无python获取多线程及子线程的返回值的评论...
更新日志
2024年11月18日
2024年11月18日
- Elgar-Motdamour-UlfWallin,RolandPontinen(2024)[24bit-96kHz]FLAC
- 苏永康《 笑下去》 新曲+精选[WAV+CUE][1G]
- 周传雄《发觉》[WAV+CUE][1.1G]
- 证声音乐图书馆《真夏派对 x 浩室》[320K/MP3][67.19MB]
- 张镐哲.1994-无助【波丽佳音】【WAV+CUE】
- Relic.2024-浮在虛无的诗意【SEEAHOLE】【FLAC分轨】
- 群星.2001-台语(原主唱)排行总冠军黄金典藏版6CD【柯达唱片】【WAV+CUE】
- 证声音乐图书馆《真夏派对 x 浩室》[FLAC/分轨][379.1MB]
- 徐良《东西世界》[WAV+CUE][1.1G]
- 证声音乐图书馆《真夏派对 x 迪斯可》[320K/MP3][67.9MB]
- TheDutchSwingCollegeBand-JubileeConcert(LiveRemastered2024)(1980)[24Bit-96kHz]FLAC
- 永恒英文金曲精选6《TheBestOfEverlastingFavouritesVol.6》[WAV+CUE]
- ABC唱片-鲍比达·新民乐《满江红》[APE+CUE]
- 许嵩.2014-不如吃茶去【海蝶】【WAV+CUE】
- 周笔畅.2024-HAVE.A.GOOD.NIGHT【SN.Music】【FLAC分轨】