首页 > 编程 > Python > 正文

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

2020-02-16 10:43:59
字体:
来源:转载
供稿:网友

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 threadingclass 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。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表