python multiprocessing 질문드립니다 !(수정)
조회수 2575회
Test라는 class를 정의한 후 그 속에 write, read 함수를 정의 하고, 객체를 생성한다음, 멀티프로세싱 모듈을 이용하여 두 함수를 동시에 실행시켜 보았을때, self변수들을 잘 사용하는지 확인하려고 코딩을 해보았습니다 ! 따라서 기대되는 결과값은 0부터 20까지 출력되고 종료되는 것입니다. 하지만, 콘솔에서 아무일도 일어나지 않습니다. 왜그런 걸까요? (win10이고 python==3.6 입니다.)
import time
from multiprocessing import Process
class Test:
def __init__(self):
self.queue = []
self.end = 0
def write(self):
for i in range(20):
self.queue.append((i, i+1)) # 큐에 데이터 추가
# 마지막까지 입력이 완료된 후, break될 수 있도록 end 값수정
if i == 19:
self.end = 1
def read(self):
while True:
if not self.queue: # 큐가 비어있으면 1초 슬립
time.sleep(1)
else:
ans = self.queue.pop(0) # 큐에 데이터가 있을시 읽어들임
print(ans[1])
# 큐에 데이터가 없고 end값이 1이면 종료
if not self.queue and self.end == 1:
break
if __name__ == '__main__':
tester = Test() #객체생성
p1 = Process(target=tester.write, args=()) #write 프로세스
p1.start()
p2 = Process(target=tester.read, args=()) #read 프로세스
p2.start()
p1.join()
p2.join()
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
멀티쓰레드가 아니라 멀티프로세스 입니다.
쉽게 메모장을 두개 띄워놓고 내용을 공유하고 싶다는 것이 질문자의 핵심 질문입니다.
현대의 운영체제에서 프로세스는 서로 격리된 공간으로 볼 수 있습니다.
쉽게 A 메모장의 메모리를 B 메모장에서 접근 할 수 없습니다.
정리하면 위의 소스는 멀티쓰레드로 하면 원하는 결과를 얻을 수 있었을 겁니다. 그러나 멀티프로세스이기 때문에 프로세스간에 (메모리에) 접근 할 수 없으므로 기대하는 결과를 못 얻는 것 입니다.
그러면 어떤식으로 데아터를 주고 받고 데이터(변수)를 공유할 수 있는가?
깊은 내용은 시스템 프로그래밍 서적에서 IPC 주제를 통해 학습하시면 됩니다.
파이썬에서는 링크를 참조해보시기 바랍니다.
multiprocessing 모듈에서 제공하는 공유 메모리를 이용하는 방법으로 문서에 주어진 에제를 분석해보면 감이 올겁니다.
댓글 입력