Python多线程与子线程返回值获取的两种主流方案
本文介绍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中获取多线程及子线程返回值的方法,希望能对读者有所帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢大家对本站的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













