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 合并文件的具体实例
Aug 08 Python
python时间整形转标准格式的示例分享
Feb 14 Python
Python 元类实例解析
Apr 04 Python
python 日期操作类代码
May 05 Python
使用Python实现图像标记点的坐标输出功能
Aug 14 Python
python 实现兔子生兔子示例
Nov 21 Python
Pytorch 实现数据集自定义读取
Jan 18 Python
Python中sys模块功能与用法实例详解
Feb 26 Python
执行Python程序时模块报错问题
Mar 26 Python
Python 实现打印单词的菱形字符图案
Apr 12 Python
python 引用传递和值传递详解(实参,形参)
Jun 05 Python
简单了解Python多态与属性运行原理
Jun 15 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连接MySQL代码的参数说明
2008/06/07 PHP
PHP遍历数组的三种方法及效率对比分析
2015/02/12 PHP
Mootools 1.2教程 滚动条(Slider)
2009/09/15 Javascript
jquery下jstree简单应用 - v1.0
2011/04/14 Javascript
文件编码导致jquery失效的解决方法
2013/06/26 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
2013/11/22 Javascript
javascript对JSON数据排序的3个例子
2014/04/12 Javascript
推荐一个自己用的封装好的javascript插件
2015/01/29 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
2015/03/12 Javascript
JavaScript实现基于Cookie的存储类实例
2015/04/10 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
2016/12/14 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
修改Nodejs内置的npm默认配置路径方法
2018/05/13 NodeJs
vue-cli3.0使用及部分配置详解
2018/08/29 Javascript
利用jquery和BootStrap实现动态滚动条效果
2018/12/03 jQuery
基于ssm框架实现layui分页效果
2019/07/27 Javascript
python检测lvs real server状态
2014/01/22 Python
Python实现全局变量的两个解决方法
2014/07/03 Python
查看django版本的方法分享
2018/05/14 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
2018/12/04 Python
使用coverage统计python web项目代码覆盖率的方法详解
2019/08/05 Python
pytorch 改变tensor尺寸的实现
2020/01/03 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
小 200 行 Python 代码制作一个换脸程序
2020/05/12 Python
Python CategoricalDtype自定义排序实现原理解析
2020/09/11 Python
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
中班幼儿评语大全
2014/04/30 职场文书
村班子对照检查材料
2014/08/18 职场文书
公司领导班子对照检查存在问题整改措施
2014/10/02 职场文书
十八大标语口号
2014/10/09 职场文书
不同意离婚代理词
2015/05/23 职场文书
2016新教师培训心得体会范文
2016/01/08 职场文书
使用Html+Css实现简易导航栏功能(导航栏遇到鼠标切换背景颜色)
2021/04/07 HTML / CSS
Django项目如何获得SSL证书与配置HTTPS
2021/04/30 Python
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android