파이썬 심화(병렬처리)

오상윤·2023년 1월 3일
0

파이썬 심화

목록 보기
7/9

병렬처리

프로세스와 쓰레드

프로세스

  • 하드디스크(프로그램) -> 프로세스(메모리)
  • 실행중인 프로그램
  • 자원과 쓰레드로 구성

쓰레드

  • 프로세스 내에서 실제 작업을 수행
  • 파이썬은 인터프리터 언어로서 기본적으로 싱글 쓰레드에서 순차적으로 동작
  • 병렬처리를 위해선 별도의 모듈을 사용하여 수행해야 한다

멀티쓰레드

  • 쥬피터 노트북이나 코랩에서 하는거보다 아나콘다 프롬포트에서 하는게 좋다
  • 파이썬에서 멀티쓰레드를 쓴 것과 싱글 쓰레드로 실행시킨 것은 실행시간이 거의 차이가 없다
  • 파이썬의 GIL(Global Interpreter Lock)정책 때문
import time
from threading import Thread
def work(work_id,start,end,result):
    total = 0
    for i in range(start,end):
        total+=i
    result.append(total)
    # 현재 실행중인 프로그램에만 실행하겠다.
    if __name__=="__main__":
        # 현재시간 저장
        start = time.time()
        result = []
        # 멀티쓰레드 핵심
        th1 = Thread(target=work, args=(1, 0, 10000, result))
        th2 = Thread(target=work, args=(2, 100001, 20000, result))
        # start를해야 시작
        th1.start()
        th2.start()
        # 불완전한 종료를 방지하기위한 함수
        # join 메소드는 파이썬에게 프로세스가 종료 될 때까지 대기하도록 지시
        th1.join()
        th2.join()
    print(sum(result))
    # 처리하는데 걸린 시간 계산
    print(time.time()-start)

멀티 프로세싱(Pool)

from multiprocessing import Pool
def f(X):
    return x*x
if __name__ == '__main__':
    # 자식 프로세스를 4개 만들겠다
    p = Pool(4)
    # 프로세스에 적당히 분배를 해라.
    result = p.map(f, [1,2,3,4])
    p.close()
    print(result)

멀티 프로새싱(Proces)

import os
from multiprocessing import Process
def f(x):
    print(x*x)
print(__name__)
if __name__ == '__main__':
    numbers[1,2,3,4]
    # 할당량을 지정
    proc1 = Process(target=f, args = (numbers[0],))
    proc1.start()
    proc2 = Process(target=f, args = (numbers[1],))
    proc2.start()
    proc3 = Process(target=f, args = (numbers[2],))
    proc3.start()
    proc4 = Process(target=f, args = (numbers[3],))
    proc4.start()
    proc1.join()
    proc2.join()
    proc3.join()
    proc4.join()
profile
가보자가보자~

0개의 댓글