파이썬에서 멀티 프로세싱으로 생산자-소비자 문제 구현
파이썬에서 멀티 프로세싱을 구현해보았습니다.
생산자 함수와 소비자 함수는 각각 별도의 프로세스에서 실행되며,
메인 프로세스는 일정 시간이 지난 후 각 프로세스를 종료 시킵니다.
파이썬에서 특이한 것은 Queue, Event 등의 객체가 각 프로세스 간에 동기화 된다는 것입니다. 마치 스레드처럼요.
일반적인 객체(변수)는 Process의 args 파라미터에 넣어도 프로세스 간에 동기화되지 않으므로 주의하시기 바랍니다.
참고 자료:
생산자 함수와 소비자 함수는 각각 별도의 프로세스에서 실행되며,
메인 프로세스는 일정 시간이 지난 후 각 프로세스를 종료 시킵니다.
파이썬에서 특이한 것은 Queue, Event 등의 객체가 각 프로세스 간에 동기화 된다는 것입니다. 마치 스레드처럼요.
일반적인 객체(변수)는 Process의 args 파라미터에 넣어도 프로세스 간에 동기화되지 않으므로 주의하시기 바랍니다.
from multiprocessing import Process, Queue, Event
import time
def produce(q, e):
counter = 1
while e.is_set():
item = 'item {0:0>4}'.format(counter)
print('{} produce: {}'.format(time.time(), item))
q.put(item)
counter += 1
time.sleep(0.2)
print('produce func finish')
def consume(q, e):
while e.is_set():
val = q.get()
print('{} consume: {}'.format(time.time(), val))
time.sleep(0.7)
print('consume func finish')
if __name__ == '__main__':
q = Queue()
e = Event()
e.set()
p1 = Process(target=produce, args=(q, e))
p2 = Process(target=consume, args=(q, e))
p1.start()
p2.start()
print('now main process go to sleep.')
time.sleep(10)
print('main process wake up!')
e.clear()
print('work flag clear!')
p1.join()
p2.join()
print('Done!')
참고 자료:
- 비밀공장, "멀티프로세싱": http://blog.lanafac.com/5
- "Python Multiprocessing Exit Elegantly How?": http://stackoverflow.com/questions/1231599/python-multiprocessing-exit-elegantly-how
- 파이썬 멀티프로세싱 문서: https://docs.python.org/2/library/multiprocessing.html
- 파이썬 Event 클래스: https://docs.python.org/2/library/threading.html#event-objects
댓글
댓글 쓰기