2013. 8. 4. 19:03

멤버십에서 한 PPT가 올라왔는데, python 으로 분산처리를 하는 과정의 PPT였다.

지금까지 다수의 연산처리는 Multi Thread 방식을 사용해서 처리 하였었는데, 이 PPT 에 의하면 오히려 multi-Thread 방식은 속도가 더 느려진다 (Global Interpretor Locking 때문) 


http://docs.python.org/2/library/multiprocessing.html#module-multiprocessing


하여금 Multi-Processing 방식을 추천해주는데 코드는 아래와 같음. 

(사용법이 thread 사용법과 거의 동일함)

(python 2.6 이상부터는 default 모듈임)


from multiprocessing import Process,Queue


def do_work( start, end , result):

        sum =0;

        for i in range(start,end):

                sum += i;

        result.put(sum)

        return



if __name__ == "__main__":

        START, END = 0, 2000000

        result = Queue()

        pr1 = Process(target = do_work, args=(START, END/2 , result ))

        pr2 = Process(target = do_work, args=(END/2, END, result))

        pr1.start()

        pr2.start()

        pr1.join()

        pr2.join()


        result.put('STOP')

        sum = 0;

        while True :

                tmp = result.get()

                if tmp == 'STOP' : break

                else: sum += tmp

        print "RESULT : ", sum



root@k1rha:~/PYTHON/MultiProc# time python multi_proc.py

RESULT :  1999999000000


real 0m0.544s

user 0m0.384s

sys 0m0.176s




Thread 와 비교하면 어떨까?


from threading import Thread


def do_work (start, end ,result):

        sum = 0

        for i in range(start, end):

                sum += i

        result.append(sum)

        return


if __name__ == "__main__":

        START, END = 0, 2000000

        result = list()

        th1 = Thread(target=do_work, args=(START, END/2,result))

        th2 = Thread(target=do_work, args=(END/2,END,result))

        th1.start()

        th2.start()


        th1.join()

        th2.join()


        print "result: ", sum(result)


root@k1rha:~/PYTHON/thread_ex# time python thread_ex.py 

result:  1999999000000


real 0m0.810s

user 0m0.208s

sys 0m0.668s




Posted by k1rha