Study/Python

Python에서 Queue의 기본적인 사용법은 아래와 같다.


import Queue

q = Queue.Queue()

items=list()

items.append('item1')
items.append('item2')
items.append('item3')
items.append('item4')
items.append('item5')

print 'start queue'

for i in items:
q.put(i)

while q.qsize():
print q.get()

print 'end queue'


put() 함수를 사용해서 q(queue)에  item1~item5 까지 put을 수행한다. get() 함수를 사용해서 q를 비운다.

위 코드를 수행하면 아래와 같은 결과가 나온다


item1

item2

item3

item4

item5

end queue


위 동작은 item1~item5 까지를 한번에 모두 Queue에 넣고 한꺼번에 get을 수행하기 때문에 전혀 문제가 없다.


그런데 여러 Thread 상에서 비동기적으로 Queue에 put과 get을 수행해야하는 상황이라면 문제가 생긴다.


put()과 get() 함수가 기본적으로 blocking 함수이기 때문이다.


흔히 발생할 수 있는 상황은, Queue에 데이터가 없는 상황에서 get() 함수를 수행한다면 데이터가 put() 될때까지 blocking 되기 때문에 해당 Thread에서 다른 동작을 수행할 수가 없다.


해결 방법은 get()과 put()을 non-blocking 함수로 바꿔야 하는데, 방법은 아래와 같다.


import Queue

q = Queue.Queue()

items=list()

items.append('item1')
items.append('item2')
items.append('item3')
items.append('item4')
items.append('item5')

print 'start queue'

for i in items:
q.put_nowait(i)

while q.qsize():
print q.get_nowait()

print 'end queue'