python 다 중 프로 세 스 코드 예제 구현
7510 단어 python다 중 프로 세 스
개척 서브 프로 세 스
multiprocessing 에 서 는 프로 세 스 인 스 턴 스 를 만 들 기 위해 process 클래스 를 제공 합 니 다.
Process([group [, target [, name [, args [, kwargs]]]]])
# -*- 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 초 만 걸 립 니 다.병발 의 장점 을 볼 수 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.