IT개발/Python(파이썬)2010. 8. 27. 15:04
■ Queue (큐)

파이썬에서는 멀티쓰레드 환경에서 생산자/소비자 문제를 해결하기 위해서 Queue 모듈을 제공한다.

Queue 사용 방법 :
import Queue

# Queue 생성
q1 = Queue.Queue()                         # 큐의 크기가 무한대
q2 = Queue.Queue(100)                    # 큐의 크기가 100

# Queue 자료를 넣으려면
q1.put('spam')                                 # 큐에 데이터를 넣고, 차 있으면 대기한다.
q1.put_nowait('ham')                        # 큐에 데이터가 차 있으면, Queue.Full 반환

# Queue 에서 자료를 꺼내려면
q1.get()
q1.get_nowait()

# Queue 상태를 알려주는 메소드
q1.qsize()
q1.empty()
q1.full()

# Queue 를 초기화 하는 방법 
 que.__init__()
 

사용예제) 10개의 큐사이즈를 가지고, 10개 소비자, 5개의 생산자 쓰레드를 가지는 예제를 작성
import threading
import time
import random
from Queue import Queue

NR_CONSUMER = 10
NR_PROVIDER = NR_CONSUMER / 2

que = Queue(10)

class Consumer(threading.Thread):
        def run(self):
                for i in range(5):
                        print que.get()
                        time.sleep(0.0)

class Provider(threading.Thread):
        def run(self):
                for i in range(10):
                        que.put(random.randint(0,20))
                        time.sleep(0.0)

cons = []
pros = []

for i in range(NR_CONSUMER):
        cons.append(Consumer())

for i in range(NR_PROVIDER):
        pros.append(Provider())

for th in cons:
        th.start()

for th in pros:
        th.start()

for th in cons:
        th.join()

for th in pros:
        th.join()

print 'Finish All of the work'



예제2 ) Queue 를 Stack 으로 활용하기
from Queue import Queue

class Stack(Queue):
        def _get(self):
                item = self.queue[-1]
                del self.queue[-1]
                return item

s = Stack()
s.put(1)
s.put(2)
s.put('a')
s.put(3)

for i in range(4):
        print s.get()
(실행결과)
[citylock@nmsfile thread]$ ./queueStack.py
3
a
2
1
[citylock@nmsfile thread]$

예제3) Queue 초기하는 하는 방법 
>>> que = Queue.Queue()
>>> que.put('a')
>>> que.put('b')
>>> que.qsize()
2
>>> que.__init__()
>>> que.qsize()
0



Posted by 시티락