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 상용 함수 해석:
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 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.