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 pickle模块用法实例
Apr 14 Python
Python连接phoenix的方法示例
Sep 29 Python
Python实现的自定义多线程多进程类示例
Mar 23 Python
python画图系列之个性化显示x轴区段文字的实例
Dec 13 Python
使用Python 统计高频字数的方法
Jan 31 Python
Python中时间datetime的处理与转换用法总结
Feb 18 Python
详解如何设置Python环境变量?
May 13 Python
python输出电脑上所有的串口名的方法
Jul 02 Python
在Python3 numpy中mean和average的区别详解
Aug 24 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
Sep 10 Python
如何基于python3和Vue实现AES数据加密
Mar 27 Python
解决Jupyter-notebook不弹出默认浏览器的问题
Mar 30 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代码保护--Zend Guard的使用详解
2013/06/03 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
thinkphp表单上传文件并将文件路径保存到数据库中
2016/07/28 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
2019/10/15 PHP
30分钟就入门的正则表达式基础教程
2013/02/25 Javascript
javascript常用函数(2)
2015/11/05 Javascript
JavaScript编写简单的计算器
2015/11/25 Javascript
解决拦截器对ajax请求的拦截实例详解
2016/12/21 Javascript
JavaScript中Math对象的方法介绍
2017/01/05 Javascript
nodejs密码加密中生成随机数的实例代码
2017/07/17 NodeJs
Vue项目中quill-editor带样式编辑器的使用方法
2017/08/08 Javascript
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
JS实现留言板功能[楼层效果展示]
2017/12/27 Javascript
JS计算距当前时间的时间差实例
2017/12/29 Javascript
React如何避免重渲染
2018/04/10 Javascript
JavaScript 性能提升之路(推荐)
2019/04/10 Javascript
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
2015/04/08 Python
python删除文本中行数标签的方法
2018/05/31 Python
python实现Virginia无密钥解密
2019/03/20 Python
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
2020/02/24 Python
基于python实现地址和经纬度转换
2020/05/19 Python
如何教少儿学习Python编程
2020/07/10 Python
CSS3 透明色 RGBA使用介绍
2013/08/06 HTML / CSS
总结html5自定义属性有哪些
2020/04/01 HTML / CSS
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
一些Solaris面试题
2013/03/22 面试题
会计自我鉴定
2014/02/04 职场文书
大学生军训感想
2014/02/16 职场文书
毕业评语大全
2014/05/04 职场文书
企业金融服务方案
2014/06/03 职场文书
公司老总年会致辞
2015/07/30 职场文书
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python
Nginx 配置 HTTPS的详细过程
2022/05/30 Servers