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批量修改文件后缀示例代码分享
Dec 24 Python
用Python制作在地图上模拟瘟疫扩散的Gif图
Mar 31 Python
Python中表达式x += y和x = x+y 的区别详解
Jun 20 Python
Python实现统计代码行的方法分析
Jul 12 Python
运动检测ViBe算法python实现代码
Jan 09 Python
pandas通过loc生成新的列方法
Nov 28 Python
Python简单过滤字母和数字的方法小结
Jan 09 Python
详解python深浅拷贝区别
Jun 24 Python
python实现最大优先队列
Aug 29 Python
关于Flask项目无法使用公网IP访问的解决方式
Nov 19 Python
基于plt.title无法显示中文的快速解决
May 16 Python
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
使用sockets:从新闻组中获取文章(二)
2006/10/09 PHP
PHP的开发框架的现状和展望
2007/03/16 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
PHP几个实用自定义函数小结
2016/01/25 PHP
laravel 解决paginate查询多个字段报错的问题
2019/10/22 PHP
慎用 somefunction.prototype 分析
2009/06/02 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
javascript生成json数据简单示例分享
2014/02/14 Javascript
Javascript中的五种数据类型详解
2014/12/26 Javascript
15款jQuery分布引导插件分享
2015/02/04 Javascript
JS模仿手机端九宫格登录功能实现代码
2016/04/28 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
AngularJS 与Bootstrap实现表格分页实例代码
2016/10/14 Javascript
javascript回调函数详解
2018/02/06 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
Vue数据双向绑定的深入探究
2018/11/27 Javascript
vue生命周期的探索
2019/04/03 Javascript
微信小程序 WXML节点信息查询详解
2019/07/29 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
2019/08/16 Javascript
swiper4实现移动端导航栏tab滑动切换
2020/10/16 Javascript
Javascript实现打鼓效果
2021/01/29 Javascript
[43:24]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.12
2020/12/17 DOTA
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
布同 统计英文单词的个数的python代码
2011/03/13 Python
Python对列表中的各项进行关联详解
2017/08/15 Python
HTML5 Canvas API中drawImage()方法的使用实例
2016/03/25 HTML / CSS
Ootori在线按摩椅店:一家专业的按摩椅制造商
2019/04/10 全球购物
EJB面试题
2015/07/28 面试题
测绘工程本科生求职信
2013/10/10 职场文书
机关门卫制度
2014/02/01 职场文书
简单租房协议书
2014/04/09 职场文书
大国崛起英国观后感
2015/06/02 职场文书
Django 实现jwt认证的示例
2021/04/30 Python
Python机器学习算法之决策树算法的实现与优缺点
2021/05/13 Python
Python实现归一化算法详情
2022/03/18 Python
Windows server 2003卸载和安装IIS的图文教程
2022/07/15 Servers