【摘要】
近段时间,工作上需要用到多线程,并且要获取多线程的返回值,python多线程一般使用threading模块,但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
运行以上例子,返回的结果如下:
- C:\Python27\python.exe D:/bluekingProject/wd-test/app-publish/test.py
- [True, False, True, False, True, False, True, False, True, False]
二、总结
以上就是获取多线程返回值的三种方法,其中方法一和方法二用得比较多,并且第一种方法更灵活。