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 相关文章推荐
在Django的视图中使用form对象的方法
Jul 18 Python
Sanic框架Cookies操作示例
Jul 17 Python
python 实现对文件夹中的图像连续重命名方法
Oct 25 Python
Python Matplotlib库安装与基本作图示例
Jan 09 Python
Python面向对象程序设计类的封装与继承用法示例
Apr 12 Python
Django如何将URL映射到视图
Jul 29 Python
Python使用import导入本地脚本及导入模块的技巧总结
Aug 07 Python
python定间隔取点(np.linspace)的实现
Nov 27 Python
python中with语句结合上下文管理器操作详解
Dec 19 Python
Python基础之函数基本用法与进阶详解
Jan 02 Python
Python faker生成器生成虚拟数据代码实例
Jul 20 Python
OpenCV-Python实现图像平滑处理操作
Jun 08 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 intval的测试代码发现问题
2008/07/27 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
thinkPHP通用控制器实现方法示例
2017/11/23 PHP
js正文内容高亮效果的实现方法
2013/06/30 Javascript
js如何实现淡入淡出效果
2020/11/18 Javascript
jquery实现简单文字提示效果
2015/12/02 Javascript
使用堆实现Top K算法(JS实现)
2015/12/25 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
Vue.js使用v-show和v-if的注意事项
2016/12/13 Javascript
js 数据存储和DOM编程
2017/02/09 Javascript
JavaScript之事件委托实例(附原生js和jQuery代码)
2017/07/22 jQuery
Angular实现图片裁剪工具ngImgCrop实践
2017/08/17 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
jquery插件开发模式实例详解
2019/07/20 jQuery
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
vue页面更新patch的实现示例
2020/03/25 Javascript
Vue的Options用法说明
2020/08/14 Javascript
js+canvas实现刮刮奖功能
2020/09/13 Javascript
[02:09]2018DOTA2亚洲邀请赛TNC赛前采访
2018/04/04 DOTA
python网络编程调用recv函数完整接收数据的三种方法
2017/03/31 Python
Python微信库:itchat的用法详解
2017/08/14 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
python 读取DICOM头文件的实例
2018/05/07 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
python实现简单加密解密机制
2019/03/19 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
python中numpy.empty()函数实例讲解
2021/02/05 Python
美国最大的高尔夫发球时间预订网站:TeeOff.com
2018/03/28 全球购物
领先的英国注册在线药房 :Simply Meds Online
2019/03/28 全球购物
土耳其风格手工珠宝:Ottoman Hands
2019/07/26 全球购物
英国经济型酒店品牌:Travelodge
2019/12/17 全球购物
全球最大运动品牌的男装、女装和童装官方库存商:A&A Sports
2021/01/17 全球购物
《蜗牛的奖杯》教后反思
2014/04/24 职场文书
心理咨询专业自荐信
2014/07/07 职场文书
领导班子对照检查剖析材料
2014/10/13 职场文书
公司食堂管理制度
2015/08/05 职场文书