python 다 중 프로 세 스 코드 예제 구현

다 중 핵 CPU 자원 을 충분히 이용 하려 면 Python 의 대부분 상황 에서 다 중 프로 세 스 를 사용 해 야 합 니 다.Python 에 서 는 multiprocessing 이라는 가방 을 제공 하여 다 중 프로 세 스 를 실현 합 니 다.multiprocessing 은 하위 프로 세 스,프로 세 스 간 동기 화 및 통신 을 지원 하 며 Process,Queue,Pipe,Lock 등 구성 요 소 를 제공 합 니 다.
개척 서브 프로 세 스
multiprocessing 에 서 는 프로 세 스 인 스 턴 스 를 만 들 기 위해 process 클래스 를 제공 합 니 다.Process([group [, target [, name [, args [, kwargs]]]]])
  • group 그룹 으로 나 누 어 실제 사용 하지 않 음
  • target 은 호출 대상 을 표시 합 니 다.방법 이름
  • 을 입력 할 수 있 습 니 다.
  • args 는 호출 대상 에 게 원 그룹의 형식 으로 매개 변 수 를 제공 하 는 것 을 나타 낸다.예 를 들 어 target 은 함수 a 이 고 그 는 두 개의 매개 변수 m,n 이 있 으 면 이 매개 변 수 는 args=(m,n)이면 된다
  • .
  • kwargs 는 호출 대상 을 나타 내 는 사전
  • name 은 별명 으로 이 프로 세 스에 이름 을 짓 는 것 과 같 습 니 다
  • 먼저 작은 예 를 들 자.
    
    # -*- coding:utf-8 -*-
    from multiprocessing import Process, Pool
    import os
    import time
    
    
    def run_proc(wTime):
      n = 0
      while n < 3:
        print "subProcess %s run," % os.getpid(), "{0}".format(time.ctime())  #                
        time.sleep(wTime)  #  (  )
        n += 1
    
    if __name__ == "__main__":
      p = Process(target=run_proc, args=(2,)) #     
      p.start()   #    
      print "Parent process run. subProcess is ", p.pid
      print "Parent process end,{0}".format(time.ctime())
    
    
    실행 결과:
    Parent process run. subProcess is 30196
    Parent process end,Mon Mar 27 11:20:21 2017
    subProcess 30196 run, Mon Mar 27 11:20:21 2017
    subProcess 30196 run, Mon Mar 27 11:20:23 2017
    subProcess 30196 run, Mon Mar 27 11:20:25 2017
    실행 결과 에 따 르 면 부모 프로 세 스 가 실 행 된 후에 도 하위 프로 세 스 가 실 행 됩 니 다.이것 은 좀 비(zombie)프로 세 스 를 만 들 수 있 습 니 다.
    일반적으로 하위 프로 세 스 가 끝 날 때 부모 프로 세 스 에 게 자신 이 차지 하고 있 는 메모 리 를 비우 고 커 널 에 종료 정 보 를 남 깁 니 다.부모 프로 세 스 는 하위 프로 세 스 가 끝 났 음 을 알 았 을 때 커 널 에서 하위 프로 세 스 의 종료 정 보 를 꺼 냅 니 다.그러나 부모 프로 세 스 가 하위 프로 세 스 보다 일찍 끝나 면 하위 프로 세 스 의 종료 정보 가 커 널 에 머 물 러 있 고 하위 프로 세 스 는 좀 비(zombie)프로 세 스 가 될 수 있 습 니 다.많은 좀 비 프로 세 스 가 쌓 이면 메모리 공간 이 밀 려 납 니 다.
    좀 비 진행 을 피 할 수 있 는 방법 은 무엇 입 니까?
    프로 세 스 의 속성 deamon 을 소개 합 니 다.값 이 TRUE 일 때 부모 프로 세 스 가 끝나 면 이 프로 세 스 는 실행 을 종료 합 니 다(아직 실행 되 지 않 았 더 라 도).
    그래서 위의 프로그램 에 p.deamon=true 를 더 해서 효 과 를 보 세 요.
    
    # -*- coding:utf-8 -*-
    from multiprocessing import Process, Pool
    import os
    import time
    
    
    def run_proc(wTime):
      n = 0
      while n < 3:
        print "subProcess %s run," % os.getpid(), "{0}".format(time.ctime())
        time.sleep(wTime)
        n += 1
    
    if __name__ == "__main__":
      p = Process(target=run_proc, args=(2,))
      p.daemon = True  #  daemon
      p.start()
      print "Parent process run. subProcess is ", p.pid
      print "Parent process end,{0}".format(time.ctime())
    실행 결과:
    Parent process run. subProcess is 31856
    Parent process end,Mon Mar 27 11:40:10 2017
    이것 은 문제 가 또 왔 습 니 다.하위 프로 세 스 가 완료 되 지 않 았 습 니 다.이것 은 원 하 는 결과 가 아 닙 니 다.하위 프로 세 스 를 실행 한 후에 야 부모 프로 세 스 를 끝 낼 수 있 습 니까?
    p.join()방법 을 도입 합 니 다.하위 프로 세 스 가 끝 난 후에 야 부모 프로 세 스 가 실 행 된 코드 입 니 다.
    
    # -*- coding:utf-8 -*-
    from multiprocessing import Process, Pool
    import os
    import time
    
    
    def run_proc(wTime):
      n = 0
      while n < 3:
        print "subProcess %s run," % os.getpid(), "{0}".format(time.ctime())
        time.sleep(wTime)
        n += 1
    
    if __name__ == "__main__":
      p = Process(target=run_proc, args=(2,))
      p.daemon = True
      p.start()
      p.join()  #  join  
      print "Parent process run. subProcess is ", p.pid
      print "Parent process end,{0}".format(time.ctime())
    실행 결과:
    subProcess 32076 run, Mon Mar 27 11:46:07 2017
    subProcess 32076 run, Mon Mar 27 11:46:09 2017
    subProcess 32076 run, Mon Mar 27 11:46:11 2017
    Parent process run. subProcess is 32076
    Parent process end,Mon Mar 27 11:46:13 2017
    이렇게 하면 모든 과정 이 순조롭게 실 행 될 수 있다.
    프로 세 스 를 클래스 로 정의 합 니 다.
    프로 세 스 클래스 를 계승 하여 프로 세 스 클래스 를 정의 하고 run 방법 을 실현 합 니 다.인 스 턴 스 p 는 p.start()를 호출 할 때 run 방법 을 자동 으로 호출 합 니 다.
    다음 과 같다.
    
    # -*- coding:utf-8 -*-
    from multiprocessing import Process, Pool
    import os
    import time
    
    
    class Myprocess(Process):
    
      def __init__(self, wTime):
        Process.__init__(self)
        self.wTime = wTime
    
      def run(self):
        n = 0
        while n < 3:
          print "subProcess %s run," % os.getpid(), "{0}".format(time.ctime())
          time.sleep(self.wTime)
          n += 1
    
    
    if __name__ == "__main__":
      p = Myprocess(2)
      p.daemon = True
      p.start()  #    run  
      p.join()
      print "Parent process run. subProcess is ", p.pid
      print "Parent process end,{0}".format(time.ctime())
    
    
    실행 결 과 는 이전 예 와 같다.
    여러 프로 세 스 만 들 기
    CPU 의 이 용 률 을 높이 기 위해 여러 프로 세 스 를 만들어 야 하 는 경우 가 많 습 니 다.수량 이 적 을 때 하나의 process 인 스 턴 스 를 수 동 으로 생 성 할 수 있 습 니 다.프로 세 스 의 수량 이 많 을 때 순환 을 이용 할 수 있 지만 프로그래머 가 수 동 으로 시스템 에서 병행 하 는 프로 세 스 의 수량 이 필요 합 니 다.때로는 번 거 로 울 수도 있 습 니 다.이때 프로 세 스 풀 은 그 효 과 를 발휘 할 수 있다.전달 매개 변 수 를 통 해 병렬 프로 세 스 의 수 를 제한 할 수 있 습 니 다.기본 값 은 CPU 의 핵 입 니 다.
    직접 예:
    
    # -*- coding:utf-8 -*-
    from multiprocessing import Process,Pool
    import os,time
    
    def run_proc(name):    ##            
      for i in range(5):  
        time.sleep(0.2)  #  0.2 
        print 'Run child process %s (%s)' % (name, os.getpid())
    #         1    
    
    if __name__ =='__main__': #     
      print 'Run the main process (%s).' % (os.getpid())
      mainStart = time.time() #          
      p = Pool(8)      #     
      for i in range(16):                 #  14   
        p.apply_async(run_proc,args=('Process'+str(i),))#       run_proc  ,
                                #args           。
    
      print 'Waiting for all subprocesses done ...'
      p.close() #     
      p.join() #             ,          
      print 'All subprocesses done'
      mainEnd = time.time() #         
      print 'All process ran %0.2f seconds.' % (mainEnd-mainStart) #       
    
    
    실행 결과:
    시작 부분
    Run the main process (30920).
    Waiting for all subprocesses done …
    Run child process Process0 (32396)
    Run child process Process3 (25392)
    Run child process Process1 (28732)
    Run child process Process2 (32436)
    끝 부분:
    Run child process Process15 (25880)
    All subprocesses done
    All process last 2.49 seconds.
    관련 설명:
    이 프로 세 스 풀 은 병렬 프로 세 스에 대한 제한 수량 이 8 개 이 고 프로그램 이 실 행 될 때 16 개의 프로 세 스 가 발생 합 니 다.프로 세 스 풀 은 시스템 내 프로 세 스 의 병렬 수량 을 자동 으로 관리 하고 나머지 프로 세 스 는 대기 열 에서 기다 릴 것 입 니 다.병발 수량 을 제한 하 는 것 은 시스템 에서 병발 하 는 프로 세 스 가 많 을 수록 좋 은 것 이 아니 라 병발 프로 세 스 가 너무 많아 서 CPU 의 대부분 시간 을 프로 세 스 스케줄 링 에 사용 할 수 있 기 때 문 입 니 다.
    다 중 프로 세 스 병행 기술 을 사용 할 때 하나의 프로세서 로 서 프로 세 스 의 실행 은 직렬 입 니 다.그러나 어떤 프로 세 스 가 CPU 자원 을 얻 고 실행 되 는 지 는 예측 할 수 없습니다.(예 를 들 어 실행 결과 의 시작 부분,각 프로 세 스 의 실행 순서 가 정 해 지지 않 음)프로 세 스 의 비동기 성 을 나 타 냅 니 다.
    단일 프로그램 이 14 회 run 을 실행 하면proc 함수,그러면 최소 16 초 걸 립 니 다.프로 세 스 의 병발 을 통 해 2.49 초 만 걸 립 니 다.병발 의 장점 을 볼 수 있 습 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기