Python thread threading 多种方法获取多线程返回值

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

import threading  
import Queue  
  
  
# 判断值是否为偶数  
def is_even(value):  
    if value % 2 == 0:  
        return True  
    else:  
        return False  
  
  
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)  # 在执行函数的同时,把结果赋值给result,  
        # 然后通过get_result函数获取返回的结果  
  
    def get_result(self):  
        try:  
            return self.result  
        except Exception as e:  
            return None  
  
result = []  
threads = []  
for i in range(10):  
    t = MyThread(is_even, args=(i,))  
    t.start()  
    threads.append(t)  
for t in threads:  
    t.join()  # 一定执行join,等待子进程执行结束,主进程再往下执行  
    result.append(t.get_result())  
print result  

方法二:通过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()

方法三:通过创建线程池(threadpool)的方式获取返回值,由于该模块属于第三方模块,因此需要先进行安装:pip install threadpool,具体执行代码如下:

import threadpool  
  
# 判断值是否为偶数  
def is_even(value):  
    if value % 2 == 0:  
        return True  
    else:  
        return False  
  
  
# 回调函数,接受的参数(请求本身,和请求工作函数执行结果)可以省略  
results = []  
def get_result(request, result):  
     global results  
     results.append(result)  
  
  
# data 设置为长度为10的列表,(列表中每一个数作为参数传递给工作函数运行一次)  
data = range(10)  
# 声明可容纳五个线程的池  
pool = threadpool.ThreadPool(5)  
# 创建线程运行内容请求列表(线程工作函数,线程工作参数列表,回调函数)  
requests = threadpool.makeRequests(is_even, data, get_result)  
# 将每一个线程请求扔进线程池  
[pool.putRequest(req) for req in requests]  
# 等待data被消耗完,所有线程运行结束。  
pool.wait()  
print results  
————————————————
版权声明:本文为CSDN博主「阿木木爱打代码」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_20663229/article/details/94484526

您可能还喜欢...

发表回复