python获取threading多线程的return返回值
·
我们正常使用 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()
更多推荐
已为社区贡献1条内容
所有评论(0)