Python 다 중 프로 세 스 병행 작업 중 프로 세 스 풀 의 인 스 턴 스

Python 을 이용 하여 시스템 관 리 를 할 때,특히 여러 개의 파일 디 렉 터 리 를 동시에 조작 하거나,여러 대의 호스트 를 원 격 으로 제어 할 때,병행 작업 은 많은 시간 을 절약 할 수 있다.피 조작 대상 의 수가 많 지 않 을 때 multiprocessing 중의 process 동 태 를 직접 이용 하여 여러 프로 세 스 를 만 들 수 있 습 니 다.10 여 개 는 괜 찮 지만 수백 개,수천 개의 목표 라면 수 동 으로 프로 세 스 의 수량 을 제한 하 는 것 이 너무 번 거 롭 습 니 다.이때 프로 세 스 풀 이 역할 을 발휘 할 때 가 되 었 습 니 다.
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 다 중 프로 세 스 병행 작업 에서 프로 세 스 풀 의 인 스 턴 스 는 바로 작은 편집 이 여러분 에 게 공유 한 모든 내용 입 니 다.참고 하 시 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기