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字符编码
Nov 12 Python
Python3实现简单可学习的手写体识别(实例讲解)
Oct 21 Python
python实现决策树
Dec 21 Python
Python调用C语言的方法【基于ctypes模块】
Jan 22 Python
pygame游戏之旅 添加游戏暂停功能
Nov 21 Python
python数据处理 根据颜色对图片进行分类的方法
Dec 08 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
Jul 11 Python
使用WingPro 7 设置Python路径的方法
Jul 24 Python
PyQt5使用QTimer实现电子时钟
Jul 29 Python
python开头的coding设置方法
Aug 08 Python
python logging模块的使用
Sep 07 Python
python tqdm用法及实例详解
Jun 16 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
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
DOM基础及php读取xml内容操作的方法
2015/01/23 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
PHP回调函数简单用法示例
2019/05/08 PHP
PHP的介绍以及优势详细分析
2019/09/05 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
JS日历 推荐
2006/12/03 Javascript
基于jquery中children()与find()的区别介绍
2013/04/26 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
基于javascript的COOkie的操作实现只能点一次
2014/12/26 Javascript
基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享
2015/09/21 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
2016/11/09 Javascript
利用jquery禁止外层滚动条的滚动
2017/01/05 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
2017/03/07 Javascript
js轮播图无缝滚动效果
2017/06/17 Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
2018/04/25 Javascript
vue 循环加载数据并获取第一条记录的方法
2018/09/26 Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
2020/10/09 Javascript
python编程实现归并排序
2017/04/14 Python
python 实现对数据集的归一化的方法(0-1之间)
2018/07/17 Python
python super用法及原理详解
2020/01/20 Python
Python模块相关知识点小结
2020/03/09 Python
python 实现仿微信聊天时间格式化显示的代码
2020/04/17 Python
python多进程使用函数封装实例
2020/05/02 Python
浅析CSS3 用text-overflow解决文字排版问题
2020/10/28 HTML / CSS
基于HTML5陀螺仪实现ofo首页眼睛移动效果的示例
2017/07/31 HTML / CSS
YOOX美国官方网站:全球著名的多品牌时尚网络概念店
2016/09/11 全球购物
天巡全球:Skyscanner Global
2017/06/20 全球购物
加拿大高尔夫超市:Golf Town
2018/01/12 全球购物
Bogner美国官网:滑雪服中的”Dior”
2018/01/30 全球购物
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
立志成才演讲稿
2014/09/04 职场文书
感谢信怎么写
2015/01/21 职场文书
2016年过年放假安排通知
2015/08/18 职场文书
2019年作为一名实习生的述职报告
2019/09/29 职场文书