python使用threading获取线程函数返回值的实现方法

这篇文章主要介绍了python使用threading获取线程函数返回值的实现方法,需要的朋友可以参考下

threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。python当前版本的多线程库没有实现优先级、线程组,线程也不能被停止、暂停、恢复、中断。

threading模块提供的类: 



  Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer,
local。



threading 模块提供的常用方法:



  threading.currentThread(): 返回当前的线程变量。



  threading.enumerate():
返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。



  threading.activeCount():
返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。



threading 模块提供的常量:



  threading.TIMEOUT_MAX 设置threading全局超时时间。

好了,正文开始:



最近需要用python写一个环境搭建工具,多线程并行对环境各个部分执行一些操作,并最终知道这些并行执行的操作是否都执行成功了,也就是判断这些操作函数的返回值是否为0。但是threading并没有显式的提供获取各个线程函数返回值的方法,只好自己动手,下面就介绍一下自己的实现方式。

一开始考虑到执行的操作可能有很多,而且后续会不断补充,因此先写了一个通用的多线程执行类,封装线程操作的基本方法,如下:  
 

import threading

class MyThread(object):

  def __init__(self, func_list=None):

  #所有线程函数的返回值汇总,如果最后为0,说明全部成功

   
self.ret_flag = 0

   
self.func_list = func_list

    self.threads
= []

  def set_thread_func_list(self, func_list):

    """

    @note:
func_list是一个list,每个元素是一个dict,有func和args两个参数

    """

   
self.func_list = func_list

  def start(self):

    """

    @note:
启动多线程执行,并阻塞到结束

    """

    self.threads
= []

   
self.ret_flag = 0

    for
func_dict in self.func_list:

     
if func_dict["args"]:

       
t = threading.Thread(target=func_dict["func"],
args=func_dict["args"])

     
else:

       
t = threading.Thread(target=func_dict["func"])

     
self.threads.append(t)

    for
thread_obj in self.threads:

     
thread_obj.start()

    for
thread_obj in self.threads:

     
thread_obj.join()

  def ret_value(self):

    """

    @note:
所有线程函数的返回值之和,如果为0那么表示所有函数执行成功

    """

    return
self.ret_flag



MyThread类会接受一个func_list参数,每个元素是一个dict,有func和args两个key,func是真正要执行的函数引用,args是函数的参数。其中最主要的方法是start方法,会多线程执行每个func,然后一直等到所有线程都执行结束后退出。接下来的关键就是如何对self.ret_flag设置正确的值,以判断所有的线程函数是否都返回0了。

我的实现是,在MyThread
class中写一个方法trace_func,作为直接的线程函数,这个trace_func中执行真正需要执行的函数,从而可以获取到该函数的返回值,设置给self.ret_flag。

这个trace_func的第一参数是要执行的func引用,后面是这个func的参数,具体代码如下:  
 

def start(self):

  """

  @note: 启动多线程执行,并阻塞到结束

  """

  self.threads = []

  self.ret_flag = 0

  for func_dict in self.func_list:

    if
func_dict["args"]:

     
new_arg_list = []

     
new_arg_list.append(func_dict["func"])

     
for arg in func_dict["args"]:

       
new_arg_list.append(arg)

     
new_arg_tuple = tuple(new_arg_list)

     
t = threading.Thread(target=self.trace_func,
args=new_arg_tuple)

    else:

     
t = threading.Thread(target=self.trace_func,
args=(func_dict["func"],))

   
self.threads.append(t)

  for thread_obj in self.threads:

   
thread_obj.start()

  for thread_obj in self.threads:

   
thread_obj.join()



这样能够成功获得返回值了,实验:  
 

def func1(ret_num):

  print "func1 ret:%d" % ret_num

  return ret_num

def func2(ret_num):

  print "func2 ret:%d" % ret_num

  return ret_num

def func3():

  print "func3 ret:100"

  return 100

mt = MyThread()

g_func_list = []

g_func_list.append({"func":func1,"args":(1,)})

g_func_list.append({"func":func2,"args":(2,)})

g_func_list.append({"func":func3,"args":None})

mt.set_thread_func_list(g_func_list)

mt.start()

print "all thread ret : %d" % mt.ret_flag



最后的输出结果

    

func1 ret:1

func2 ret:2

func3 ret:100

all thread ret : 103

总结

以上所述是小编给大家介绍的python使用threading获取线程函数返回值的实现方法,希望对大家有所帮助

数据分析师 Python

CDA大数据分析圈是国内第一个汇聚大数据全面资源、数据人必备的APP。CDA整合了近千个大数据相关专业网站及媒体来源,汇聚了数百场国内大数据活动与会议,数千名名技术大牛、行业领袖,以及总结了最系统的优质学习课程资源。在这里,你可每天接触到最新行业资讯、前沿技术干货等信息;你可参与CDA俱乐部活动、各类大型会议,亲身与大牛接触,获得实务经验。你也可在专业课堂上与国内顶尖讲师进行交流切磋,最有效规划自身大数据职业发展。

CDA大数据分析圈是数据人的家园,圈子里,资源流通,共享智慧,合作发展。CDA以“创新、开放、分享”的理念,期待你的加入!

python使用threading获取线程函数返回值的实现方法的更多相关文章

  1. 统计文件种类数+获取子shell返回值的其它方法

    前言 只是作为一个shell的小小练习和日常统计用,瞎折腾的过程中也是摸到了获取子shell返回值的几种方法: 肯定还有别的方法,跟进程间的通信相关,希望你能提出建议和补充,谢谢~ 完整程序: #! ...

  2. C++11获取线程的返回值

    C++11 std::future and std::promise 在许多时候,我们会有这样的需求--即我们想要得到线程返回的值. 但是在C++11 多线程中我们注意到,std::thread对象会 ...

  3. Boost 信号与槽,获取槽函数返回值,使用占位参数传递信号携带的参数

    test1: 展示了, 1 信号与槽的基本使用,    2 要获取槽函数的返回值时的注意事项 #if 1 /* 参考blog https://www.cnblogs.com/jiayayao/p/62 ...

  4. Python全栈之路----函数----返回值

    函数外部的代码想要获取函数的执行结果,就可以在函数里用return语句,把结果返回. def stu_register(name,age,course='PY',country='CN'): prin ...

  5. java 多线程 day10 获取线程的返回值 CallableAndFuture

    import java.util.Random;import java.util.concurrent.*; /** * Created by chengtao on 17/12/4. * * 获取线 ...

  6. Python从线程获取函数返回值

    Python中利用强大的threading模块可以很容易的实现多线程开发,提高运行速度.这一般是对某个进行大量计算操作的的函数进行多线程处理,然后合并各线程的结果.获取函数返回值的方法可以如下: 1) ...

  7. python多线程获取子线程任务返回值

    今天想实现多线程更新资产信息,所以使用到了threading,但是我需要每个线程的返回值,这就需要我在threading.Thread的基础上进行封装 def auto_asset(node): re ...

  8. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

  9. Python学习教程(learning Python)--2.3.4Python函数返回值

    本节讨论Python函数返回值问题. Python和C语言一样,也可以在函数结束时返回一个值.但在定义自己的Python函数时,是不需要指定返回值数据类型的,这和Python不关心变量的数据类型是一致 ...

随机推荐

  1. Vue 电影信息影评(豆瓣,猫眼)

    Vue电影信息影评网站 此网站是我的毕业设计,题目是"基于HTML5的电影信息汇总弄网站",由于最近在看Vue.js,所以就想用Vue.js来构建一个前端网站,这里code就不大篇 ...

  2. spring 数据库字段映射

    当有复杂名称字段时: 在repository中写代码字段名 List<Grid> findByLocIsWithin(GeoJsonPolygon boundary); 可以添加field ...

  3. 用 Flask 来写个轻博客 (8) — (M)VC_Alembic 管理数据库结构的升级和降级

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 Alembic 查看指令 manager db 的可用选项 ...

  4. 64位系统sql链接oracle

    在SQL Server 2008中连接Oracle,完成查询.插入操作 建立指向Oracle的连接 在32位的系统中sql链接oracle,在链接服务器里点击服务器对象,右键链接服务器,选择micro ...

  5. SCI小论文投稿记录

    英文小论文投的是SCI 3区的一个刊物,收录在spring,ei等, 投稿的时候2019/2/3影响因子2.8左右 现在2019/8/13  影响因子3.844 先科普下论文的各个状态 1. Subm ...

  6. python作业/练习/实战:1、简单登录脚本

    作业要求 写一个登陆的小程序 username = xiaoming passwd = 123456 1.输入账号密码,输入正确就登陆成功, 提示:欢迎xxxx登陆,今天的日期是xxx. 2.输入错误 ...

  7. 【题解】sweet

    题目描述 为了防止糖果被小猫偷吃,John把他的糖果放在了很多的高台上,一个高台可以认为是一段平行于X轴的线段,并且高台的y坐标都是大于0的,每个高台都有左端点和高台的长度,每个高台都有糖果.所有的高 ...

  8. linux 下安装chrome的rpm包

    1. 下载chrome的rpm包,假设叫cho. 2.执行命令 rpm -ivh cho 3.报错提示需要lsb>=4.0,执行命令 yum install lsb 等待安装完毕. 4. 重新执 ...

  9. Python之小测试:用正则表达式写一个小爬虫用于保存贴吧里的所有图片

    很简单的两步: 1.获取网页源代码 2.利用正则表达式提取出图片地址 3.下载 #!/usr/bin/python #coding=utf8 import re # 正则表达式 import urll ...

  10. tomcat部署项目后,项目没有成功部署到tomcat里面,或者部署的是之前项目

    用svn下载java项目到本地,导入eclipse里面,然后部署到tomcat里,启动tomcat,一闪而过,在浏览器中打开,报404错(找不到页面),其实是项目没有成功部署到tomcat,可以打开t ...