안녕하세영.


python parallel에 대한 내용은 이번 4번째 포스팅이 마지막이 델 것 같네요. 그다지 어려운 사용 방법이 아니기 때문에..


간단하게 예시를 뜯어 보는 것도 좋겠다 싶어서. python parallel 홈페이지에서 다운 받아서 압축 푸신 폴더에 있는 예제를 가지고


사용하는 방법에 대해서 적어보겠습니다.


예제는 http://www.parallelpython.com/에서 다운받아서 사용하였습니다.


예제 파일 주소


....../pp-1.6.2/examples/sum_primes.py 


파일을 열어보시면 간단하게 되어 있는데요.



먼저 import 부분을 살펴보면 다음과 같습니다.


import math

import sys

import pp


3개의 import 문이 있구요. 


import pp 요 부분이 우리가 사용하고자 하는 python parallel의 라이브러리를 불러오는 부분이 되겠죠?.


혹시 이부분에서 에러가 나시는 분들은 PYTHONPATH를 확인해주세요. 혹시 경로가 추가가 안된 부분이 있으시면 추가하시구용.


그럼 import 부분은 간단하게 끝나구요.



함수 부분을 살펴보면 다음과 같습니다. sum_primes.py는 2개의 함수를 가지고 있네요.


def isprime(n):

    """Returns True if n is prime and False otherwise"""

    if not isinstance(n, int):

        raise TypeError("argument passed to is_prime is not of 'int' type")

    if n < 2:

        return False

    if n == 2:

        return True

    max = int(math.ceil(math.sqrt(n)))

    i = 2

    while i <= max:

        if n % i == 0:

            return False

        i += 1

    return True


def sum_primes(n):

    """Calculates sum of all primes below given integer n"""

    return sum([x for x in xrange(2, n) if isprime(x)])


머 함수 부분이야 어째뜬.. input과 return(output)이 있구나. 하는 정도로 넘어 갑시당.



다음은 요번 포스팅에서 꽤 중요한 부분이에요. 바로 ppserver의 정보를 불러오는 곳인데요. 

소스는 다음과 같습니다. 


# tuple of all parallel python servers to connect with

ppservers = ()

#ppservers=("21x.15x.21x.xxx:43500", )


if len(sys.argv) > 1:

    ncpus = int(sys.argv[1])

    # Creates jobserver with ncpus workers

    job_server = pp.Server(ncpus, ppservers=ppservers)

else:

    # Creates jobserver with automatically detected number of workers

    job_server = pp.Server(ppservers=ppservers)


print "Starting pp with", job_server.get_ncpus(), "workers"


#은 파이썬에서 주석인거 아시죠? 


주석이 아닌 부분을 보시면 ppservers =()로 자동으로 ppserver가 돌아가고 있는 곳을 찾아서 등록하는 방법인데요.


병렬처리환경을 집에서 구축하신 분이시라면 별 문제 없겠지만, 저는 클라우드 상이나 대규모 컴퓨팅 자원을 활용하고 싶은거니깐요.


주석처리한 것 처럼 사용하면 되겠습니다.


#ppservers=("21x.15x.21x.13x:43500", ) --> 요렇게요.


":43500"은 포트번호인거 아실꺼구요. 앞에 "21x.15x.21x.13x"은 ppserver가 돌아가고 있는 컴퓨터의 네트워크 주소를 작성해주시면 되겠습니다.


주석문에서도 확인하실 수 있는 것처럼 tuple 형태로 작성해주셔야 데용. 뒤에 콤마(,) 확인하시구용.


그 다음은 job_server를 셋팅하는 부분이 되구요. 


편하신 대로 셋팅해서 사용하시면 되겠네용.



ppserver는 job을 기반으로 동작하는데요. 이제 마지막입니다.


# The following submits 8 jobs and then retrieves the results

inputs = (100000, 100100, 100200, 100300, 100400, 100500, 100600, 100700)

jobs = [(input, job_server.submit(sum_primes, (input, ), (isprime, ),

        ("math", ))) for input in inputs]


for input, job in jobs:

    print "Sum of primes below", input, "is", job()


job_server.print_stats()


아까 맨위에 있던 함수를 사용해서 병렬처리 할 부분을 작성한 예제가 되겠구요.


여러분이 병렬처리 하고 싶은 내용과 함수로 변경하시면 사용하실 수 있겠네용.




예제를 돌린 결과 입니다. 제 CPU는 2개의 코어로 이뤄져있어서요. 다음과 같은 결과가 나옵니다.


[yourid@blrblrblrblrblr examples]$ python sum_primes.py 

Usage: python sum_primes.py [ncpus]

    [ncpus] - the number of workers to run in parallel,

    if omitted it will be set to the number of processors in the system

Starting pp with 2 workers

Sum of primes below 100 is 1060

Sum of primes below 100000 is 454396537

Sum of primes below 100100 is 454996777

Sum of primes below 100200 is 455898156

Sum of primes below 100300 is 456700218

Sum of primes below 100400 is 457603451

Sum of primes below 100500 is 458407033

Sum of primes below 100600 is 459412387

Sum of primes below 100700 is 460217613

Job execution statistics:

 job count | % of all jobs | job time sum | time per job | job server

         9 |        100.00 |      10.4010 |     1.155671 | local

Time elapsed since server creation 5.23457694054


일부러 하나의 코어로 돌려보면 다음과 같은 결과가 나옵니다.


[yourid@blrblrblrblrblrblr examples]$ !p

python sum_primes.py 

Usage: python sum_primes.py [ncpus]

    [ncpus] - the number of workers to run in parallel,

    if omitted it will be set to the number of processors in the system

Starting pp with 1 workers

Sum of primes below 100 is 1060

Sum of primes below 100000 is 454396537

Sum of primes below 100100 is 454996777

Sum of primes below 100200 is 455898156

Sum of primes below 100300 is 456700218

Sum of primes below 100400 is 457603451

Sum of primes below 100500 is 458407033

Sum of primes below 100600 is 459412387

Sum of primes below 100700 is 460217613

Job execution statistics:

 job count | % of all jobs | job time sum | time per job | job server

         9 |        100.00 |      10.1251 |     1.125009 | local

Time elapsed since server creation 10.1320021152



+ Recent posts