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之永远强大的函数
Sep 14 Python
Django实现组合搜索的方法示例
Jan 23 Python
scrapy-redis的安装部署步骤讲解
Feb 27 Python
Django Sitemap 站点地图的实现方法
Apr 29 Python
Python API 自动化实战详解(纯代码)
Jun 11 Python
解决Python对齐文本字符串问题
Aug 28 Python
Django框架表单操作实例分析
Nov 04 Python
python3实现单目标粒子群算法
Nov 14 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
Apr 03 Python
Django项目如何正确配置日志(logging)
Apr 29 Python
Python实现天气查询软件
Jun 07 Python
详解Python函数print用法
Jun 18 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
php4的session功能评述(三)
2006/10/09 PHP
一个ubbcode的函数,速度很快.
2006/10/09 PHP
关于初学PHP时的知识积累总结
2013/06/07 PHP
保存到桌面、设为桌面且带图标的PHP代码
2013/11/19 PHP
php实现按文件名搜索文件的远程文件查找器
2014/05/10 PHP
PHP中通过trigger_error触发PHP错误示例
2015/06/23 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
在html页面中包含共享页面的方法
2008/10/24 Javascript
jquery tools 系列 scrollable学习
2009/09/06 Javascript
Mootools 1.2教程(21)——类(二)
2009/09/15 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
javascript放大镜效果的简单实现
2013/12/09 Javascript
JavaScript操作class和style样式代码详解
2016/02/13 Javascript
jQuery获取父元素节点、子元素节点及兄弟元素节点的方法
2016/04/14 Javascript
使用RequireJS库加载JavaScript模块的实例教程
2016/06/06 Javascript
AngularGauge 属性解析详解
2016/09/06 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
详解如何使用Vue2做服务端渲染
2017/03/29 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
2017/05/17 Javascript
详解html-webpack-plugin用法全解
2018/01/22 Javascript
详解vue配置后台接口方式
2019/03/29 Javascript
Vue 一键清空表单的实现方法
2020/02/07 Javascript
JS正则表达式常见函数与用法小结
2020/04/13 Javascript
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
Django 路由控制的实现
2019/07/17 Python
Python @property装饰器原理解析
2020/01/22 Python
Python的in,is和id函数代码实例
2020/04/18 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
如何转换一个字符串到enum值
2014/04/12 面试题
先进个人事迹材料
2014/01/25 职场文书
小学清明节活动方案
2014/03/08 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
2015年党员发展工作总结
2015/05/13 职场文书
PostgreSQL出现死锁该如何解决
2022/05/30 PostgreSQL