# File: queue-example-2.py

import threading
import Queue

import time, random

WORKERS = 2

class Worker(threading.Thread):

    def __init__(self, queue):
        self.__queue = queue
        threading.Thread.__init__(self)

    def run(self):
        while 1:
            item = self.__queue.get()
            if item is None:
                break # reached end of queue

            # pretend we're doing something that takes 10-100 ms
            time.sleep(random.randint(10, 100) / 1000.0)

            print "task", item, "finished"

#
# run with limited queue

queue = Queue.Queue(3)

for i in range(WORKERS):
    Worker(queue).start() # start a worker

for item in range(10):
    print "push", item
    queue.put(item)

for i in range(WORKERS):
    queue.put(None) # add end-of-queue markers

## push 0
## push 1
## push 2
## push 3
## push 4
## push 5
## task 0 finished
## push 6
## task 1 finished
## push 7
## task 2 finished
## push 8
## task 3 finished
## push 9
## task 4 finished
## task 6 finished
## task 5 finished
## task 7 finished
## task 9 finished
## task 8 finished
