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

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

本文介绍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 相关产品和应用

全部下载

专题列表