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 相关文章推荐
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
Apr 25 Python
Python Matplotlib库入门指南
May 18 Python
Python查询阿里巴巴关键字排名的方法
Jul 08 Python
python中不能连接超时的问题及解决方法
Jun 10 Python
Python OpenCV处理图像之滤镜和图像运算
Jul 10 Python
为什么你还不懂得怎么使用Python协程
May 13 Python
Python在cmd上打印彩色文字实现过程详解
Aug 07 Python
Python Django中的STATIC_URL 设置和使用方式
Mar 27 Python
python zip,lambda,map函数代码实例
Apr 04 Python
容易被忽略的Python内置类型
Sep 03 Python
Python接口自动化测试框架运行原理及流程
Nov 30 Python
Python万能模板案例之matplotlib绘制甘特图
Apr 13 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生成不重复标识符的方法
2014/11/21 PHP
php截取字符串函数分享
2015/02/02 PHP
详解PHP防止盗链防止迅雷下载的方法
2017/04/26 PHP
javascript生成/解析dom的CDATA类型的字段的代码
2007/04/22 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
2013/03/25 Javascript
JS增加行复制行删除行的实现代码
2013/11/09 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
js中hash和ico的关联分析
2015/02/05 Javascript
JavaScript如何动态创建table表格
2020/08/02 Javascript
浅析BootStrap模态框的使用(经典)
2016/04/29 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
js获取时间函数及扩展函数的方法
2016/10/30 Javascript
利用jQuery解析获取JSON数据
2017/04/08 jQuery
微信小程序利用co处理异步流程的方法教程
2017/05/20 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
2017/12/28 Javascript
简化Python的Django框架代码的一些示例
2015/04/20 Python
使用url_helper简化Python中Django框架的url配置教程
2015/05/30 Python
django允许外部访问的实例讲解
2018/05/14 Python
Python实现的读写json文件功能示例
2018/06/05 Python
详解关于Django中ORM数据库迁移的配置
2018/10/08 Python
Python OpenCV读取png图像转成jpg图像存储的方法
2018/10/28 Python
详细分析Python可变对象和不可变对象
2020/07/09 Python
python中time tzset()函数实例用法
2021/02/18 Python
通过css3动画和opacity透明度实现呼吸灯效果
2019/08/09 HTML / CSS
image-set实现Retina屏幕下图片显示详细介绍
2012/12/24 HTML / CSS
深入浅析HTML5中的SVG
2015/11/27 HTML / CSS
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
AmazeUI 图标的示例代码
2020/08/13 HTML / CSS
电气自动化专业职业规划范文
2014/02/16 职场文书
乡镇食品安全责任书
2014/07/28 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
2015年小学教科研工作总结
2015/07/20 职场文书
导游词之云南-元阳梯田
2019/10/08 职场文书
导游词之永济鹳雀楼
2020/01/16 职场文书
Python学习之包与模块详解
2022/03/19 Python