python 다 중 스 레 드 및 하위 스 레 드 의 반환 값 가 져 오기

최근 에 필요 한 것 이 있 습 니 다.다 중 스 레 드 를 사용 하 는 것 이 적당 하지만 모든 스 레 드 의 반환 값 이 필요 합 니 다.이것 은 제 가 threading.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 와 주 스 레 드 print get 때 문 이 라 고 생각 합 니 다.result()가 함께 시스템 자원 을 선점 하여 발생 합 니 다.
다음은 python 이 하위 스 레 드 의 반환 값 을 얻 는 것 을 소개 합 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.

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 의 대기 열 은 스 레 드 가 안전 합 니 다.즉,여러 스 레 드 가 한 대기 열 에 동시에 접근 해도 충돌 하지 않 습 니 다.Python 대기 열 은 세 가지 FIFO 가 먼저 나 오고 FILO 가 먼저 나 온 후에 나 오 며 우선 순위 대기 열(단독 우선 순위 매개 변수 로 순 서 를 결정 합 니 다)이 있 습 니 다.사용 대기 열 은 간단 한 생산자 C 소비자 모델 을 실현 할 수 있다.
총결산
위 에서 말 한 것 은 소 편 이 소개 한 python 이 다 중 스 레 드 와 하위 스 레 드 의 반환 값 을 가 져 오 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기