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爬虫辅助利器PyQuery模块的安装使用攻略
Apr 24 Python
浅谈python中requests模块导入的问题
May 18 Python
详解如何在Apache中运行Python WSGI应用
Jan 02 Python
Python中使用双下划线防止类属性被覆盖问题
Jun 27 Python
Python实现微信小程序支付功能
Jul 25 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
Nov 20 Python
Python装饰器用法与知识点小结
Mar 09 Python
python中get和post有什么区别
Jun 19 Python
详解anaconda离线安装pytorchGPU版
Sep 08 Python
Python调用REST API接口的几种方式汇总
Oct 19 Python
多个版本的python共存时使用pip的正确做法
Oct 26 Python
python使用XPath解析数据爬取起点小说网数据
Apr 22 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获取数组中重复最多的元素的实现方法
2014/11/11 PHP
浅谈php冒泡排序
2014/12/30 PHP
作为程序员必知的16个最佳PHP库
2015/12/09 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
2016/10/08 PHP
PHP中include和require的区别实例分析
2017/05/07 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题
2007/01/09 Javascript
Javascript学习笔记-详解in运算符
2011/09/13 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/25 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
JS中call/apply、arguments、undefined/null方法详解
2016/02/15 Javascript
JS实现列表的响应式排版(推荐)
2016/09/01 Javascript
js实现非常棒的弹出div
2016/10/06 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
利用JS实现scroll自定义滚动效果详解
2017/10/17 Javascript
vue中实现在外部调用methods的方法(推荐)
2018/02/08 Javascript
详解使用Next.js构建服务端渲染应用
2018/07/10 Javascript
微信小程序修改swiper默认指示器样式的实例代码
2018/07/18 Javascript
详解JavaScript栈内存与堆内存
2019/04/04 Javascript
Vue 动态添加路由及生成菜单的方法示例
2019/06/20 Javascript
详解package.json版本号规则
2019/08/01 Javascript
Vue数字输入框组件的使用方法
2019/10/19 Javascript
JS数组的常用10种方法详解
2020/05/08 Javascript
js定时器出现第一次延迟的原因及解决方法
2021/01/04 Javascript
python定时器使用示例分享
2014/02/16 Python
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
Python基于pandas实现json格式转换成dataframe的方法
2018/06/22 Python
Python OpenCV读取png图像转成jpg图像存储的方法
2018/10/28 Python
python 获取url中的参数列表实例
2018/12/18 Python
python中metaclass原理与用法详解
2019/06/25 Python
OpenCV Python实现图像指定区域裁剪
2021/03/12 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
CSS教程:CSS3圆角属性
2009/04/02 HTML / CSS
html5 Canvas实现图片旋转的示例
2018/01/15 HTML / CSS
Linux如何压缩可执行文件
2014/03/27 面试题
给领导的致歉信范文
2014/01/13 职场文书
法定代表人免职证明
2015/06/24 职场文书