파이썬(Python)/문법

[Python] 멀티프로세스, 변수 교환 방법(Queue, Pipe, Multiprocess, Multitask, 파이썬)#2

끄적끄적아무거나 2022. 6. 29. 09:02
반응형

 

목차

     

     

     

     

     

     

    앞서 포스트에서 멀티프로세서(Multiprocess) 선언과 사용법에 대해 알아보았습니다(https://scribblinganything.tistory.com/563). 이번 시간에는 각 프로세스 간에 통신을 하여 값을 주고 받거나 대기를 사용해서 하나씩 처리하는 방법에 대해 알아보겠습니다.

     

    프로세스는 각 각 별도의 메모리를 사용하므로 pipe라는 장치를 사용해서 데이터를 주고 받아야 합니다.

     

    • pipe : 멀티 프로세스(Multiprocess) 간에 통신으로 값을 주고 받기
    • queue : 멀티 프로스세(Multiprocess)의 입력 값을 queue에 넣고 원할 때 마다 처리 하기

     

     

     

     

    파이썬 멀티프로세스(Multiprocess) 변수 교환 방법(Pipe)

    프로세스 간에 값을 주고 받는 방식은 아래 예제를 통해 쉽게 이해할 수 있습니다. 예제를 진행 전에 예제가 어떻게 구성되었는지에 대해 간략하게 설명드리겠습니다.

     

    • func0, func1이라는 2개의 함수 정의
    • a_pipe, b_pipe를 pipe로 선언해서 값을 주고 받는 통로로 사용
    • 파이트는 send와 recv 라는 내장 함수를 사용해서 주고 받음
    • func0, func1을 각 프로세스로 선언
    • 각 프로세스 입력 값을 파이프로 연결

     

    예제 코드>>

    from multiprocessing import Process, Pipe
    
    def func0(pipe):
        pipe.send("hello world")
        pipe.close()
    
    def func1(pipe):
        print(pipe)
    
    if __name__ == '__main__':
        a_pipe, b_pipe = Pipe()
        p0 = Process(target=func0, args=(a_pipe,))
        p0.start()
        p1 = Process(target=func1, args=(b_pipe.recv(),))
        p1.start()
    
        p0.join()
        p1.join()

    3~5번 라인: func0 함수 선언, pipe의 send로 데이터를 다른 pipe에 전달

    7~8번 라인: func1 함수 선언

    11번 라인: 파이프 변수 선언

    12번 라인: p0 프로세스 선언, 입력으로 파이프 선언

    13번 라인: p0 프로세스 동작 시작

    14번 라인: p1 프로세스 선언, 입력으로 a_pipe에 들어온 값을 사용

     

    결과>>

    hello world

     

     

     

     

     

     

    파이썬 멀티프로세스(Multiprocess) 변수 대기열 만들기(Queue)

    이번에는 Queue라는 모듈을 사용해서 입력할 값을 Queue에 저장하고 프로세스에서 원할때마다 처리하는 방법에 대해 알아보겠습니다. 예제의 구성은 아래와 같습니다.

     

    • func라는 함수선언
    • put 이라는 내장 함수로 queue에 넣기
    • Queue, Process 선언
    • qsize로 현재 queue에 저장된 값 개수 확인
    • get이라는 내장 함수로 queue에 저장된 값 가져오기

     

    예제 코드>>

    from multiprocessing import Process, Queue
    
    def func(list, q):
        for x in list:
            q.put(x)
    
    if __name__ == "__main__":
        q = Queue()
        p = Process(target=func, args=(["h","e","l","l","o"], q))
        p.start()
        p.join()
        
        for x in range(q.qsize()):
            print(q.get())

    3~5번 라인: func 함수 선언

    4~5번 라인: queue에 list 값 하나씩 넣기

    8번라인: 큐 선언

    9번라인: 프로세스 선언

    10~11번 라인: 프로세스 동작 및 종료

    13~14번 라인: Queue에 저장된 값 하나씩 출력

     

     

    결과>>

    h
    e
    l
    l
    o

     

     

    반응형