Python 프로 세 스 풀 응용 사례 분석

이 글 의 사례 는 Python 프로 세 스 풀 응용 을 다 루 었 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
생 성 해 야 할 하위 프로 세 스 의 수가 많 지 않 을 때 multiprocessing 의 process 동 태 를 이용 하여 여러 프로 세 스 를 생 성 할 수 있 습 니 다.그러나 수백 개 이상 의 목표 라면 수 동 으로 프로 세 스 를 만 드 는 작업량 이 많 습 니 다.이 때 multiprocessing 모듈 에서 제공 하 는 Pool 방법 을 사용 할 수 있 습 니 다.
Pool 을 초기 화 할 때 최대 프로 세 스 수 를 지정 할 수 있 습 니 다.새로운 요청 이 Pool 에 제출 되 었 을 때 풀 이 채 워 지지 않 으 면 이 요청 을 수행 할 새로운 프로 세 스 를 만 듭 니 다.그러나 풀 의 프로 세 스 수가 지정 한 최대 값 에 이 르 렀 다 면 이 요청 은 풀 에 프로 세 스 가 끝 날 때 까지 기 다 립 니 다.이전 프로 세 스 로 새로운 작업 을 수행 할 수 있 습 니 다.다음 인 스 턴 스 를 보십시오.

# -*- coding:utf-8 -*-
from multiprocessing import Pool
import os, time, random
def worker(msg):
  t_start = time.time()
  print("%s    ,    %d" % (msg,os.getpid()))
  # random.random()    0~1      
  time.sleep(random.random()*2) 
  t_stop = time.time()
  print(msg,"    ,  %0.2f" % (t_stop-t_start))
po = Pool(3) #        ,     3
for i in range(0,10):
  # Pool().apply_async(      ,(          ,))
  #                     
  po.apply_async(worker,(i,))
print("----start----")
po.close() #      ,   po        
po.join() #   po          ,    close    
print("-----end-----")

실행 결과:
----start----
0 시작,프로 세 스 번호 21466
1.실행 을 시작 합 니 다.프로 세 스 번 호 는 21468 입 니 다.
2.실행 을 시작 합 니 다.프로 세 스 번 호 는 21467 입 니 다.
0 실행 완료,1.01 소모
3.실행 을 시작 합 니 다.프로 세 스 번 호 는 21466 입 니 다.
2 실행 완료,1.24 소모
4.실행 을 시작 합 니 다.프로 세 스 번 호 는 21467 입 니 다.
3.실행 완료,0.56 소모
5.실행 을 시작 합 니 다.프로 세 스 번 호 는 21466 입 니 다.
1 집행 완료,1.68 소모
6.실행 을 시작 합 니 다.프로 세 스 번 호 는 21468 입 니 다.
4 실행 완료,시간 0.67 소모
7.실행 을 시작 합 니 다.프로 세 스 번 호 는 21467 입 니 다.
5 실행 완료,0.83 소모
8.실행 을 시작 합 니 다.프로 세 스 번 호 는 21466 입 니 다.
6 실행 완료,0.75 소모
9.실행 을 시작 합 니 다.프로 세 스 번 호 는 21468 입 니 다.
7 실행 완료,1.03 소모
8 실행 완료,1.05 소모
9 실행 완료,1.69 소모
-----end-----
multiprocessing.Pool 상용 함수 해석:
  • apply_async(func[,args[,kwds]]):비 차단 방식 으로 func 를 호출 합 니 다(병렬 실행,차단 방식 은 이전 프로 세 스 가 종 료 될 때 까지 기 다 려 야 다음 프로 세 스 를 실행 할 수 있 습 니 다).args 는 func 에 전달 하 는 매개 변수 목록 이 고 kwds 는 func 에 전달 하 는 키워드 매개 변수 목록 입 니 다.
  • close():Pool 을 닫 고 새로운 작업 을 받 지 않도록 합 니 다.
  • terminate():임무 수행 여부 와 상 관 없 이 즉시 종료 합 니 다.
  • join():주 프로 세 스 가 막 히 고 하위 프로 세 스 가 종료 되 기 를 기다 리 며 close 또는 terminate 후에 사용 해 야 합 니 다.
  • 프로 세 스 풀 의 Queue
    Pool 을 사용 하여 프로 세 스 를 만 들 려 면 multiprocessing.Manager()의 Queue()가 아니 라 multiprocessing.Queue()를 사용 해 야 합 니 다.그렇지 않 으 면 다음 과 같은 오류 정 보 를 얻 을 수 있 습 니 다.
    RuntimeError: Queue objects should only be shared between processes through inheritance.
    다음 인 스 턴 스 는 프로 세 스 풀 의 프로 세 스 가 어떻게 통신 하 는 지 보 여 줍 니 다.
    
    # -*- coding:utf-8 -*-
    #   import  Queue Manager
    from multiprocessing import Manager,Pool
    import os,time,random
    def reader(q):
      print("reader  (%s),    (%s)" % (os.getpid(), os.getppid()))
      for i in range(q.qsize()):
        print("reader Queue     :%s" % q.get(True))
    def writer(q):
      print("writer  (%s),    (%s)" % (os.getpid(), os.getppid()))
      for i in "itcast":
        q.put(i)
    if __name__=="__main__":
      print("(%s) start" % os.getpid())
      q = Manager().Queue() #   Manager  Queue
      po = Pool()
      po.apply_async(writer, (q,))
      time.sleep(1) #         Queue    ,                
      po.apply_async(reader, (q,))
      po.close()
      po.join()
      print("(%s) End" % os.getpid())
    
    
    실행 결과:
    (11095) start
    writer 시작(11097),부모 프로 세 스(11095)
    reader 시작(11098),부모 프로 세 스(11095)
    reader 가 Queue 에서 메 시 지 를 가 져 옵 니 다:i
    reader 에서 Queue 에서 메시지 가 져 오기:t
    reader 에서 Queue 에서 메시지 가 져 오기:c
    reader 가 Queue 에서 메 시 지 를 가 져 옵 니 다:a
    reader 에서 Queue 에서 메시지 가 져 오기:s
    reader 에서 Queue 에서 메시지 가 져 오기:t
    (11095) End
    파 이 썬 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
    본 논문 에서 말 한 것 이 여러분 의 Python 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

    좋은 웹페이지 즐겨찾기