【摘要】
近段时间,工作上需要用到多线程,并且要获取多线程的返回值,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]
二、总结
以上就是获取多线程返回值的三种方法,其中方法一和方法二用得比较多,并且第一种方法更灵活。
版权声明:本文为qq_20663229原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。