python获取多线程及子线程的返回值


Posted in Python onNovember 15, 2017

最近有个需求,用多线程比较合适,但是我需要每个线程的返回值,这就需要我在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获取多线程及子线程的返回值,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python3中的真除和Floor除法用法分析
Mar 16 Python
Python安装第三方库及常见问题处理方法汇总
Sep 13 Python
python进阶_浅谈面向对象进阶
Aug 17 Python
[原创]pip和pygal的安装实例教程
Dec 07 Python
Python科学计算包numpy用法实例详解
Feb 08 Python
python+opencv像素的加减和加权操作的实现
Jul 14 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
Aug 30 Python
用python实现英文字母和相应序数转换的方法
Sep 18 Python
python的Jenkins接口调用方式
May 12 Python
计算Python Numpy向量之间的欧氏距离实例
May 22 Python
如何在mac下配置python虚拟环境
Jul 06 Python
浅谈pytorch中stack和cat的及to_tensor的坑
May 20 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 #Python
python enumerate函数的使用方法总结
Nov 15 #Python
Python set常用操作函数集锦
Nov 15 #Python
python机器学习库常用汇总
Nov 15 #Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
Nov 15 #Python
给你选择Python语言实现机器学习算法的三大理由
Nov 15 #Python
Python数据结构之顺序表的实现代码示例
Nov 15 #Python
You might like
PHP 和 HTML
2006/10/09 PHP
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
解析coreseek for sphinx的使用
2013/06/21 PHP
PHP生成压缩文件实例
2015/02/07 PHP
CentOS下PHP安装Oracle扩展
2015/02/15 PHP
开启PHP Static 关键字之旅模式
2015/11/13 PHP
关于PHP中interface的用处详解
2020/07/26 PHP
收藏一些不常用,但是有用的代码
2007/03/12 Javascript
通过Mootools 1.2来操纵HTML DOM元素
2009/09/15 Javascript
在IE6下发生Internet Explorer cannot open the Internet site错误
2010/06/21 Javascript
js对象基础实例分析
2015/01/13 Javascript
JavaScript中switch语句的用法详解
2015/06/03 Javascript
基于jQuery实现选取月份插件附源码下载
2015/12/28 Javascript
超链接怎么正确调用javascript函数
2016/05/23 Javascript
基于JavaScript实现评论框展开和隐藏功能
2017/08/25 Javascript
Angular实现的简单定时器功能示例
2017/12/28 Javascript
JS弹窗 JS弹出DIV并使整个页面背景变暗功能的实现代码
2018/04/21 Javascript
你点的 ES6一些小技巧,请查收
2018/04/25 Javascript
JS如何在数组指定位置插入元素
2020/03/10 Javascript
Vue中computed及watch区别实例解析
2020/08/01 Javascript
基于scrapy实现的简单蜘蛛采集程序
2015/04/17 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
2019/03/11 Python
python生成任意频率正弦波方式
2020/02/25 Python
Python 去除字符串中指定字符串
2020/03/05 Python
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
介绍一下如何利用路径遍历进行攻击及如何防范
2014/01/19 面试题
《风娃娃》教学反思
2014/04/19 职场文书
银行贷款收入证明
2014/10/17 职场文书
简单的个人租房协议书范本
2014/11/26 职场文书
2014年社区教育工作总结
2014/12/02 职场文书
庆祝教师节主持词
2015/07/06 职场文书
婚宴父母致辞
2015/07/27 职场文书
《攀登者》:“海拔8000米以上,你不能指望任何人”
2019/11/25 职场文书
一篇文章带你复习java知识点
2021/06/28 Java/Android
人民币符号
2022/02/17 杂记
Android超详细讲解组件ScrollView的使用
2022/03/31 Java/Android