■ Queue (큐)
파이썬에서는 멀티쓰레드 환경에서 생산자/소비자 문제를 해결하기 위해서 Queue 모듈을 제공한다.
Queue 사용 방법 :
사용예제) 10개의 큐사이즈를 가지고, 10개 소비자, 5개의 생산자 쓰레드를 가지는 예제를 작성
예제2 ) Queue 를 Stack 으로 활용하기
예제3) 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 를 초기화 하는 방법
# 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'
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()
(실행결과)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
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