Python 다 중 프로 세 스 병행 작업 중 프로 세 스 풀 의 인 스 턴 스
6230 단어 python다 중 프로 세 스병발 하 다Pool
Pool 은 사용자 가 호출 할 수 있 도록 지정 한 프로 세 스 를 제공 할 수 있 습 니 다.새로운 요청 이 pool 에 제출 되 었 을 때 풀 이 가득 차지 않 으 면 새 프로 세 스 를 만들어 서 이 요청 을 수행 합 니 다.그러나 풀 의 프로 세 스 수가 규정된 최대 치 에 이 르 렀 다 면 이 요청 은 풀 에 프로 세 스 가 끝 날 때 까지 기 다 려 야 새로운 프로 세 스 를 만 들 수 있 습 니 다.여기에 간단 한 예 가 하나 있다.
#!/usr/bin/env python
#coding=utf-8
"""
Author: Squall
Last modified: 2011-10-18 16:50
Filename: pool.py
Description: a simple sample for pool class
"""
from multiprocessing import Pool
from time import sleep
def f(x):
for i in range(10):
print '%s --- %s ' % (i, x)
sleep(1)
def main():
pool = Pool(processes=3) # set the processes max number 3
for i in range(11,20):
result = pool.apply_async(f, (i,))
pool.close()
pool.join()
if result.successful():
print 'successful'
if __name__ == "__main__":
main()
용량 이 3 인 프로 세 스 풀 을 만 든 다음 f(i)를 순서대로 전달 합 니 다.스 크 립 트 를 실행 한 후 ps aux|grep pool.py 를 이용 하여 프로 세 스 상황 을 보면 최대 세 개의 프로 세 스 만 실 행 될 수 있 습 니 다.pool.apply_async()는 프로 세 스 풀 에 대상 요청 을 제출 하 는 데 사 용 됩 니 다.pool.join()은 프로 세 스 풀 의 worker 프로 세 스 가 끝 날 때 까지 기다 리 는 데 사 용 됩 니 다.그러나 필수 pool.join()은 pool.close()나 pool.terminate()이후 에 사용 해 야 합 니 다.그 중에서 close()와 terminate()의 차 이 는 close()가 풀 의 worker 프로 세 스 가 끝 날 때 까지 기다 리 고 pool 을 닫 는 것 이 고 terminate()는 직접 닫 는 것 이다.result.successful()은 전체 호출 이 실 행 된 상 태 를 표시 합 니 다.워 커 가 실행 되 지 않 으 면 Assertion Error 이상 을 던 집 니 다.멀 티 프로 세 싱 을 이용 한 풀 은 수백 개 나 수천 개의 병행 작업 을 편리 하 게 처리 할 수 있 고 스 크 립 트 의 복잡성 도 크게 떨어진다.
――――――――――――――――――――――――――――――――――
파 이 썬 다 중 프로 세 스 병행(multiprocessing)
Python 디자인 의 제한 때문에최대 1 개의 CPU 핵심 만 사용 할 수 있다.
Python 은 아주 좋 은 다 중 프로 세 스 패키지 multiprocessing 을 제공 합 니 다.하나의 함수 만 정의 하면 Python 이 다른 모든 일 을 완성 할 것 입 니 다.이 가방 을 통 해 단일 프로 세 스 에서 동시 실행 으로 전환 할 수 있 습 니 다.
1.새 단일 프로 세 스
만약 우리 가 소량의 프로 세 스 를 새로 만 들 면 다음 과 같이 할 수 있 습 니 다.
import multiprocessing
import time
def func(msg):
for i in xrange(3):
print msg
time.sleep(1)
if __name__ == "__main__":
p = multiprocessing.Process(target=func, args=("hello", ))</
p.start()
p.join()
print "Sub-process done."
2.프로 세 스 풀 사용네,잘못 보지 않 았 습 니 다.스 레 드 탱크 가 아 닙 니 다.그것 은 당신 을 다 핵 CPU 로 가득 채 울 수 있 을 뿐만 아니 라,사용 방법 도 매우 간단 하 다.
애플 리 케 이 션 조심 하 세 요async,async 를 빠 뜨리 면 차단 버 전이 됩 니 다.
processes=4 는 최대 병행 프로 세 스 수량 입 니 다.
import
multiprocessing
import
time
def
func(msg):
for
i
in
xrange(3):
print
msg
time.sleep(1)
if
__name__
==
"__main__":
pool
=
multiprocessing.Pool(processes=4)
for
i
in
xrange(10):
msg
=
"hello
%d"
%(i)
pool.apply_async(func,
(msg,
))
pool.close()
pool.join()
print
"Sub-process(es)
done."
3.Pool 을 사용 하고 결 과 를 지 켜 봐 야 합 니 다.더 많은 경우,우 리 는 다 중 프로 세 스 를 실행 해 야 할 뿐만 아니 라,모든 프로 세 스 의 실행 결 과 를 주목 해 야 한다.다음 과 같다.
import multiprocessing
import time
def func(msg):
for i in xrange(3):
print msg
time.sleep(1)
return "done " + msg
if __name__ == "__main__":
pool = multiprocessing.Pool(processes=4)
result = []
for i in xrange(10):
msg = "hello %d" %(i)
result.append(pool.apply_async(func, (msg, )))
pool.close()
pool.join()
for res in result:
print res.get()
print "Sub-process(es) done."
2014.12.25 업데이트네티즌 댓 글 의 피드백 에 따 르 면 윈도 에서 실행 되 는 것 은 무 너 질 수 있 습 니 다.(새 창,프로 세 스 가 열 렸 습 니 다)인 하 를 통 해 해결 할 수 있 습 니 다.
multiprocessing.freeze_support()
간이 작업 자 multiprocessing.Pool다 중 태 스 크 모델 디자인 은 비교적 복잡 한 논리 이지 만 python 은 다 중 태 스 크 의 처리 에 있어 여러 가지 편리 한 라 이브 러 리 가 있 기 때문에 프로 세 스/스 레 드 간 의 조작 디 테 일 을 너무 많이 고민 하지 않 아 도 됩 니 다.예 를 들 어 multiprocessing.Pool 이 그 중의 하나 입 니 다.
공식 적 으로 준 범례 도 간단 하 다.
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
pool = Pool(processes=4) # start 4 worker processes
result = pool.apply_async(f, [10]) # evaluate "f(10)" asynchronously
print result.get(timeout=1) # prints "100" unless your computer is *very* slow
print pool.map(f, range(10)) # prints "[0, 1, 4,..., 81]"
상세 한 설명 은 많이 하지 않 았 다.마침 제 가 가지 고 있 는 코드 가 있 습 니 다.수백 개의 url 을 요청 하고 html 페이지 를 분석 하여 정 보 를 얻 어야 합 니 다.단일 스 레 드 for 순환 효율 이 매우 낮 기 때문에 이 모듈 을 보 았 습 니 다.이 를 통 해 다 중 태 스 크 분석 을 실현 하고 싶 습 니 다.참고 코드 는 다음 과 같 습 니 다.
from multiprocessing import Pool
def analyse_url(url):
#do something with this url
return analysis_result
if __name__ == '__main__':
pool = Pool(processes=10)
result = pool.map(analyse_url, url_list)
확실히 이전 싱글 스 레 드 for 순환 urllist 목록,하나씩 analyse 요청url 이 훨씬 빠 르 지만 문 제 는 pool.map 가 실행 되 지 않 으 면 ctrl-c 가 프로그램 을 중단 하면 프로그램 이 이상 하고 영원히 종료 할 수 없다 는 것 입 니 다.stackoverflow 의 이 게시 물 을 참고 하여 다음 코드 로 수정 합 니 다.
#result = pool.map(analyse_url, url_list)
result = pool.map_async(analyse_url, url_list).get(120)
이로써 문 제 는 완벽 하 게 해결 되 었 다.이상 의 Python 다 중 프로 세 스 병행 작업 에서 프로 세 스 풀 의 인 스 턴 스 는 바로 작은 편집 이 여러분 에 게 공유 한 모든 내용 입 니 다.참고 하 시 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.