转载:(15条消息) python获取threading多线程的return返回值_python threading 返回值_星火燎愿的博客-CSDN博客
我们正常使用 threading 模块创建的线程是无法获取它所执行方法的返回值的;
如:
w = threading.Thread(target=worker,args=(i,))
一、重写线程,获取线程return返回值
要想获取线程中执行方法return的返回值,就需要重新定义 threading 的类,
也就是常说的 继承、重写;
代码:
# -*- coding: utf-8 -*- import threading,time """ 用类包装线程;调用时可以获取线程的return返回值 """ # 定义一个MyThread.py线程类 class MyThread(threading.Thread): def __init__(self, func, args=()): super(MyThread, self).__init__() self.func = func self.args = args def run(self): time.sleep(2) self.result = self.func(*self.args) def get_result(self): threading.Thread.join(self) # 等待线程执行完毕 try: return self.result except Exception: return None #获取多线程return返回值的测试方法 def admin(number): uiu = number for i in range(10): uiu = uiu+i return uiu if __name__ == "__main__": #创建四个线程 more_th1 = MyThread(admin,(5,)) more_th2 = MyThread(admin,(10,)) more_th3 = MyThread(admin,(50,)) more_th4 = MyThread(admin,(78,)) #启动线程 more_th1.start() more_th2.start() more_th3.start() more_th4.start() #线程等待(即:等待四个线程都运行完毕,才会执行之后的代码) more_th1.join() more_th2.join() more_th3.join() more_th4.join() #输出线程执行方法后的的返回值 print(more_th1.get_result()) print(more_th2.get_result()) print(more_th3.get_result()) print(more_th4.get_result())
二、使用线程池,获取return返回值
还有另一种方式获取线程执行方法的return返回值,那就是使用线程池:
代码:
# -*- coding: utf-8 -*- from concurrent.futures import ThreadPoolExecutor import threading import time # 定义获取线程return返回测试的方法 def action_a(max): my_sum = max + 1 return my_sum def action_b(max): my_sum = max + 100 time.sleep(3) return my_sum # 创建包含2个线程的线程池 pool = ThreadPoolExecutor(max_workers=2) # 向线程池提交一个任务, 20和10会作为action_a/b()方法的参数 future1 = pool.submit(action_a, 20) future2 = pool.submit(action_b, 10) # 判断future1线程是否结束---返回False表示该线程未结束,True表示该线程已经结束 print("future1线程的状态:" + str(future1.done())) #此时future1线程已结束 # 判断future2线程是否结束 print("future2线程的状态:" + str(future2.done())) #此时future2线程未结束,因为休眠了3秒 # 查看future1代表的任务返回的结果,如果线程未运行完毕,会暂时阻塞,等待线程运行完毕后再执行、输出; print(future1.result()) #此处会直接输出 # 查看future2代表的任务返回的结果 print(future2.result()) #此处会等待3秒,因为方法中休眠了3秒 # 关闭线程池 pool.shutdown()
标签:return,self,threading,线程,返回值,多线程,more From: https://www.cnblogs.com/zhiminyu/p/17447010.html