python获取多线程及子线程的返回值
最近有个需求,用多线程比较合适,但是我需要每个线程的返回值,这就需要我在threading.Thread的基础上进行封装
importthreading classMyThread(threading.Thread): def__init__(self,func,args=()): super(MyThread,self).__init__() self.func=func self.args=args defrun(self): self.result=self.func(*self.args) defget_result(self): try: returnself.result#如果子线程不使用join方法,此处可能会报没有self.result的错误 exceptException: returnNone deffoo(a,b,c): time.sleep(1) printa*2,b*2,c*2, returna*2,b*2,c*2 st=time.time() li=[] foriinxrange(4): t=MyThread(foo,args=(i,i+1,i+2)) li.append(t) t.start() fortinli: t.join()#一定要join,不然主线程比子线程跑的快,会拿不到结果 printt.get_result() et=time.time() printet-st
执行结果
024(0,2,4) 468246(2,4,6) (4,6,8) 6810(6,8,10) 1.00200009346
元组中的结果是函数foo的返回值,至于结果为什么这么乱,我猜,是因为各子线程foo的print和主线程printget_result()一起抢占系统资源造成。
下面介绍下python获得子线程的返回值,具体代码如下所示:
importsys importthreading importQueue q=Queue.Queue() defworker1(x,y): func_name=sys._getframe().f_code.co_name print"%srun..."%func_name q.put((x+y,func_name)) defworker2(x,y): func_name=sys._getframe().f_code.co_name print"%srun...."%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() whilenotq.empty(): result.append(q.get()) foriteminresult: ifitem[1]==worker1.__name__: print"%s'sreturnvalueis:%s"%(item[1],item[0]) elifitem[1]==worker2.__name__: print"%s'sreturnvalueis:%s"%(item[1],item[0])
这是目前最主流的获取线程数据的方法。使用Queue库创建队列实例,用来储存和传递线程间的数据。Python的队列是线程安全的,也就是说多个线程同时访问一个队列也不会有冲突。Python队列有三种FIFO先进先出,FILO先进后出(类似栈),优先级队列(由单独的优先级参数决定顺序)。使用队列可以实现简单生产者–消费者模型
总结
以上所述是小编给大家介绍的python获取多线程及子线程的返回值,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!