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中的fileinput模块的简单实用示例
Jul 09 Python
python中异常报错处理方法汇总
Nov 20 Python
分享给Python新手们的几道简单练习题
Sep 21 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
Apr 23 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
Apr 15 Python
Django shell调试models输出的SQL语句方法
Aug 29 Python
python判断无向图环是否存在的示例
Nov 22 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
Dec 19 Python
python多项式拟合之np.polyfit 和 np.polyld详解
Feb 18 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
python3+openCV 获取图片中文本区域的最小外接矩形实例
Jun 02 Python
python爬虫多次请求超时的几种重试方法(6种)
Dec 01 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 获取远程网页内容的函数
2009/09/08 PHP
PHP逐行输出(ob_flush与flush的组合)
2012/02/04 PHP
PHP SPL标准库之SplFixedArray使用实例
2015/05/12 PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
2016/07/21 PHP
JavaScript之编码规范 推荐
2012/05/23 Javascript
javascript作用域容易记错的两个地方分析
2012/06/22 Javascript
深入理解javascript学习笔记(一) 编写高质量代码
2012/08/09 Javascript
jquery实现图片滚动效果的简单实例
2013/11/23 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
jQuery事件绑定on()与弹窗实现代码
2016/04/28 Javascript
JavaScript随机生成颜色的方法
2016/10/15 Javascript
SVG描边动画
2017/02/23 Javascript
jQuery.cookie.js使用方法及相关参数解释
2017/03/06 Javascript
微信小程序 input输入及动态设置按钮的实现
2017/10/27 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
Vue实现内部组件轮播切换效果的示例代码
2018/04/07 Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
2019/02/13 Javascript
使用vue-router切换页面时实现设置过渡动画
2019/10/31 Javascript
基于vue.js仿淘宝收货地址并设置默认地址的案例分析
2020/08/20 Javascript
python3 flask实现文件上传功能
2020/03/20 Python
python yield关键词案例测试
2019/10/15 Python
python将时分秒转换成秒的实例
2019/12/07 Python
python各种excel写入方式的速度对比
2020/11/10 Python
英国鹦鹉店:Parrot Essentials
2018/12/03 全球购物
预订旅游活动、景点和旅游:GetYourGuide
2019/09/29 全球购物
俄罗斯购买内衣网站:Trusiki
2020/08/22 全球购物
高校生生产实习自我鉴定
2013/09/21 职场文书
捐书活动总结
2014/05/04 职场文书
建筑安全标语
2014/06/07 职场文书
外贸业务员求职信
2014/06/16 职场文书
2015年清明节网上祭英烈留言寄语
2015/03/04 职场文书
水电施工员岗位职责
2015/04/11 职场文书
医院志愿者活动总结
2015/05/06 职场文书
采购员工作总结范文
2015/08/12 职场文书
面试被问select......for update会锁表还是锁行
2021/11/11 MySQL
vscode远程免密登入Linux服务器的配置方法
2022/06/28 Servers