파이썬(Python)/문법

[Python] 멀티프로세스, 동시 작업(Multiprocess, Multitask, 파이썬) #1

끄적끄적아무거나 2022. 6. 28. 09:01
반응형

 

목차

     

    파이썬 멀티 프로세싱이란? (Multi Processing)

    파이썬은 위에서 아래로 코드가 진행되고 while 문에 걸리면 그 동안 다른 프로그램을 실행 할 수 없습니다. 이를 해결 하기 위해 파이썬에서 아래와 같이 3가지 방법을 제공 합니다.

     

    • 멀티프로세싱(Multiprocessing)
    • 멀티스레드(Multithread, threading)
    • 인터럽트(Interrupt)

     

    사실 인터럽트는 동시에 진행하는 것처럼 보이지만 실제로는 말 그대로 중간에 인터럽트가 발생하면 잠시 인터럽트 일을 처리하고 나머지 남은 일을 처리 하는 것입니다.

     

    실제 pyserial이나 blutooth 통신을 하거나 DB와 연결하거나 등 연결쪽을 위한 프로그램이 동작하면서 동시에 처리쪽도 멈추지 않고 동작해야하는 경우들이 종종 있습니다. 이럴 때 사용하는 것이 멀티 프로세싱이나 멀티 드레드 입니다. 

     

    이번 시간에는 멀티 프로세싱에 대해 알아 보고 다음 장에서 멀티 스레드(Multi thread)에 대해 알아 보겠습니다.

     

     

    실행 중인 프로그램을 프로세스라고 하고 각 각의 프로세스는 별도의 메모리(memory)와 stack, 프로그램 카운팅을 가지는 독립된 프로세서에서 동작하는 방식이라고 생각하시면 됩니다. 

     

    멀티 쓰레드(Thread)와의 차이는 쓰레드는 프로세서 내에 여러개의 실가닥처럼 메모리와 같은 자원을 공유하지만 프로세스(Process)는 혼자서 쓸꺼를 가진다는 것입니다.

     

     

    실제 사용 방법은 아래 예제를 통해 쉽게 이해해보겠습니다.

     

     

     

     

    파이썬 멀티 프로세싱 (Multi Processing) 예제

    기본 예제

     

    기본 예제 코드>>

    from multiprocessing import Process
    
    def func():
        print("Hello world")
    
    if __name__ == '__main__':
        p = Process(target=func)
        p.start()
        p.join()

    1번 라인: process 모듈을 import 합니다.

    3~4번 라인: process 에서 동작시킬 함수를 정의 합니다.

    7번 라인: process를 선언 합니다.

    8번 라인: process 시작

    9번 라인: process 종료

     

    결과>>

    Hello world

     

     

     

     

    argument 입력 예제

     

    예제 코드>>

    from multiprocessing import Process
    
    def func(text):
        print(text)
    
    if __name__ == '__main__':
        p = Process(target=func, args=("hi",))
        p.start()
        p.join()

    7번 라인: 입력 값을 args에 넣습니다. 괄호를 통해 입력 합니다.

    8번 라인: process 시작

    9번 라인: process 종료

     

    결과>>

    "hi"

     

     

     

     

     

    두개의 프로세스 동시에 동작하기

     

    예제 코드>>

    from multiprocessing import Process
    import time
    
    def func0():
        list_var = [1,2,3]
        for x in list_var:
            print(x)
            time.sleep(1)  
    
    def func1():
        list_var = ["a","b","c"]
        for x in list_var:
            print(x)
            time.sleep(0.5) 
    
    if __name__ == '__main__':
        p0 = Process(target=func0)
        p1 = Process(target=func1)
        p0.start()
        p1.start()
        print("main process is done")

    4~8번 라인: 1~3을 출력하는 함수, sleep으로 1초 간격으로 출력

    10~14번 라인: a~c를 출력하는 함수, sleep으로 0.5초 간격으로 출력

    17~20번 라인: 2개의 프로세서 구동

    21번 라인: 프로세서가 동작해도 main 함수가 완료하면 프린터문 출력

     

    결과>>

    main process is done
    1
    a
    b
    2
    c
    3

    텍스트가 먼저 출력 되고 프로세스 결과는 교차로 출력됩니다.

     

    다음 포스트에서 다른 2개의 프로세스 사이 변수 전달하는 방법(communication)과 pipe, queue에 대해 알아보겠습니다.

     

     

    반응형