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