Python多线程与子线程返回值获取的两种主流方案

Ivy
Ivy
发布时间:2026-10-14| 3人浏览过
原创

本文介绍Python中获取多线程及子线程返回值的两种主流方法。首先通过继承threading.Thread类并覆写run方法,利用成员变量存储结果;其次介绍使用线程安全的Queue队列实现生产者-消费者模型,安全传递多个线程的返回数据。

Python多线程获取返回值的需求背景

近期遇到一个开发需求,使用多线程处理任务更为合适,但关键在于需要获取每个线程执行后的返回值。为此,必须在Python标准库threading.Thread的基础上进行封装处理。

方案一:继承Thread类封装


import threading
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)
 def get_result(self):
  try:
   return self.result # 如果子线程不使用join方法,此处可能会报没有self.result的错误
  except Exception:
   return None
def foo(a,b,c):
 time.sleep(1)
 print a*2,b*2,c*2,
 return a*2,b*2,c*2
st = time.time()
li = []
for i in xrange(4):
 t = MyThread(foo,args=(i,i+1,i+2))
 li.append(t)
 t.start()
for t in li:
 t.join() # 一定要join,不然主线程比子线程跑的快,会拿不到结果
 print t.get_result()
et = time.time()
print et - st

以下是代码执行后的实际输出结果。


0 2 4 (0, 2, 4)
4 6 8 2 4 6 (2, 4, 6)
(4, 6, 8)
6 8 10 (6, 8, 10)
1.00200009346

从输出元组可以看出,这是函数foo的返回值。至于输出顺序为何显得杂乱,推测是由于各子线程中foo函数的print语句与主线程调用get_result()时的print操作共同抢占系统资源所致。

接下来介绍Python中获取子线程返回值的具体实现,相关代码如下。

方案二:使用Queue队列传递数据


import sys 
import threading 
import Queue 
q = Queue.Queue() 
def worker1(x, y): 
 func_name = sys._getframe().f_code.co_name 
 print "%s run ..." % func_name 
 q.put((x + y, func_name)) 
def worker2(x, y): 
 func_name = sys._getframe().f_code.co_name 
 print "%s run ...." % func_name 
 q.put((x - y, func_name)) 
if __name__ == '__main__': 
 result = list() 
 t1 = threading.Thread(target=worker1, name='thread1', args=(10, 5, )) 
 t2 = threading.Thread(target=worker2, name='thread2', args=(20, 1, )) 
 print '-' * 50 
 t1.start() 
 t2.start() 
 t1.join() 
 t2.join() 
 while not q.empty(): 
  result.append(q.get()) 
 for item in result: 
  if item[1] == worker1.__name__: 
   print "%s 's return value is : %s" % (item[1], item[0]) 
  elif item[1] == worker2.__name__: 
   print "%s 's return value is : %s" % (item[1], item[0]) 

这是目前获取线程数据的主流方法之一。通过导入Queue库创建队列实例,用于存储和在线程间传递数据。Python的Queue模块是线程安全的,即使多个线程同时访问同一个队列也不会产生冲突。Python队列主要支持三种模式:FIFO(先进先出)、FILO(先进后出,类似栈结构)以及由优先级参数决定顺序的优先级队列。利用队列机制,可以方便地实现简单的生产者-消费者模型。

总结

以上内容介绍了Python中获取多线程及子线程返回值的方法,希望能对读者有所帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢大家对本站的支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。