第一种方式:重写线程类,获取return返回值
1.通过自定义线程类,继承Thread类,并重写run方法;
2.在run方法中写入执行函数的方法,并把返回值赋值给result;
3.然后通过调用get_result获取每个线程的返回值;
新建一个ThreadClass.py文件和一个Demo.py文件。其中ThreadClass.py文件中的MyThread是线程类,Demo.py中有两个带有返回值的函数,实例中将func_01()方法,func_02()方法和它们的参数传递给MyThread线程类处理,并通过线程的get_result()方法获取执行的结果。
ThreadClass.py文件:
# coding:utf-8
import threading, time
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):
threading.Thread.join(self) # 等待线程执行完毕
try:
return self.result
except Exception:
return None
国外论坛写法:
import threading
class ThreadWithReturnValue(threading.Thread):
def __init__(self, *init_args, **init_kwargs):
threading.Thread.__init__(self, *init_args, **init_kwargs)
self._return = None
def run(self):
self._return = self._target(*self._args, **self._kwargs)
def join(self):
threading.Thread.join(self)
return self._return
Demo.py文件:
# coding:utf-8
import ThreadClass
def func_01(num):
return num + 1
def func_02(param, name):
print(name)
return param * 3
if __name__ == "__main__":
# 创建3个线程
for i in range(3):
task = ThreadClass.MyThread(func_01, args=(3, ))
task.start()
# 获取func_01函数的执行结果
result = task.get_result()
print(result)
task1 = ThreadClass.MyThread(func_02, args=(result, '小三'))
task1.start()
result1 = task1.get_result()
print(result1)
执行Demo.py文件获取结果:
4
小三
12
4
小三
12
4
小三
12
第二种方式:使用线程池,获取return返回值
# coding:utf-8
from concurrent.futures import ThreadPoolExecutor
import threading
import time
# 定义获取线程return返回方法
def func_01(num):
res = num + 10
return res
def func_02(num01):
res = num01 + 1000
time.sleep(10)
return res
# 创建包含2个线程的线程池
pool = ThreadPoolExecutor(max_workers=2)
# 向线程池提交一个任务
future1 = pool.submit(func_01, 5)
future2 = pool.submit(func_02, 10)
# 判断future1线程是否结束---返回False表示该线程未结束,True表示该线程已经结束
print("future1线程的状态:" + str(future1.done()))
# 判断future2线程是否结束---返回False表示该线程未结束,True表示该线程已经结束
print("future2线程的状态:" + str(future2.done()))
# 查看future1代表的任务返回的结果,如果线程未运行完毕,会暂时阻塞,等待线程运行完毕后再执行、输出;
print(future1.result()) # 此处会直接输出
# 查看future2代表的任务返回的结果
print(future2.result()) # 此处会等待3秒,因为方法中休眠了3秒
# 关闭线程池
pool.shutdown()
执行结果:
future1线程的状态:True
future2线程的状态:False
15
1010