목차
앞서 포스트에서 멀티프로세서(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
'파이썬(Python) > 문법' 카테고리의 다른 글
[Python] 멀티스레딩과 Global 변수 공유 방법(Multi threading, thread) (0) | 2022.07.01 |
---|---|
[Python] 멀티스레드란? 사용법, 예제 (Multi thread, target, args, start, join) (0) | 2022.06.30 |
[Python] 멀티프로세스, 동시 작업(Multiprocess, Multitask, 파이썬) #1 (0) | 2022.06.28 |
[Python] Try Except Else Finally Raise 구문 사용 방법, 예제 (파이썬) (0) | 2022.06.27 |
[Python] 파이썬 yield란? 사용목적 (Generator, 제너레이터) (0) | 2022.06.24 |