我们正常使用 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()

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐