如何使用 Python 获取多线程的返回值

Posted on Wed, 25 Dec 2024 16:09:12 +0800 by LiangMingJian


需求

python 多线程一般使用 threading 模块,但 threading 模块有个问题,无法直接返回线程里面运行的结果,那如果需要线程返回值那如何处理呢。

通过自定义线程类接受返回值

通过自定义线程类,继承Thread类,并复写run方法,在run方法中写入执行函数的方式,并把返回值赋值给result,然后通过调用get_result获取每个进程的返回值。

# 多线程类
class MyThread(Thread):
    result1 = None
    result2 = None

    def __init__(self, func, args=()):
        super(MyThread, self).__init__()
        self.func = func
        self.args = args

    def run(self):
        self.result1, self.result2 = self.func(*self.args)
        # 在执行函数的同时,把结果赋值给result,
        # 然后通过get_result函数获取返回的结果

    def get_result(self):
        # noinspection PyBroadException
        try:
            return self.result1, self.result2
        except Exception:
            return None


# 多线程执行函数
def Mss(info, window):
    result, furl = api_test(info, baseurl)
    sleep(0.5)
    # 等待,否则由于子进程过快,主进程未开启进度条,而执行进度条关闭命令导致矛盾
    window.close()
    return result, furl

t1 = MyThread(Mss, args=(info, myDia5))
t1.setDaemon(True)
t1.start()
result, furl = t1.get_result()

通过内置队列Queue接收返回值

通过python内置的队列Queue接收子进程的返回值,然后再从中取出。

import threading 
import Queue 
def is_even(value, q): 
    if value % 2 == 0: 
        q.put(True) 
    else: 
        q.put(False) 
        
def multithreading(): 
    q = Queue.Queue() 
    threads = [] 
    results = [] 
    
for i in range(10): 
    t = threading.Thread(target=is_even, args=(i, q)) 
    t.start() 
    threads.append(t) 
    
for thread in threads: 
    thread.join() # 等待子线程结束后,再往后面执行 
    
for _ in range(10): 
    results.append(q.get()) 
    print(results) 
    
    multithreading()