from thread import start_new_thread
from time import time, ctime, sleep
from threading import Thread, Lock
#from Queue import Queue
class Queue(object):
def __init__(self):
self.store = []
def put(self, value):
self.store.append(value)
def get(self):
return self.store.pop(0)
def empty(self):
return not self.store
class SyncQueue(Thread):
__lock = Lock()
def __init__(self, name, delay, queue):
Thread.__init__(self)
self.name = name
self.delay = delay
self.queue = queue
def run(self):
print "Starting %s" % self.name
while not self.queue.empty():
with self.__lock:
print "%s got %s" \
% (self.name,
self.queue.get())
sleep(self.delay)
while not job_done:
sleep(self.delay)
print "Exiting %s" % self.name
def print_time(thread, delay):
for i in xrange(3):
sleep(delay)
print "%s woke up at %s" % (thread, ctime(time()))
if __name__ == "__main__":
job_done = False
#q = Queue(5) # Python's Queue
q = Queue() # Custom Queue
for i in xrange(5):
q.put(i)
q1 = SyncQueue("Q1", 2, q)
q2 = SyncQueue("Q2", 1, q)
q1.start()
q2.start()
# Wait for the job to be done
while not q.empty():
pass
job_done = True
q1.join()
q2.join()
print "All done!"
ZnJvbSB0aHJlYWQgaW1wb3J0IHN0YXJ0X25ld190aHJlYWQKZnJvbSB0aW1lIGltcG9ydCB0aW1lLCBjdGltZSwgc2xlZXAKZnJvbSB0aHJlYWRpbmcgaW1wb3J0IFRocmVhZCwgTG9jawojZnJvbSBRdWV1ZSBpbXBvcnQgUXVldWUKCmNsYXNzIFF1ZXVlKG9iamVjdCk6CglkZWYgX19pbml0X18oc2VsZik6CgkJc2VsZi5zdG9yZSA9IFtdCgoJZGVmIHB1dChzZWxmLCB2YWx1ZSk6CgkJc2VsZi5zdG9yZS5hcHBlbmQodmFsdWUpCgoJZGVmIGdldChzZWxmKToKCQlyZXR1cm4gc2VsZi5zdG9yZS5wb3AoMCkKCglkZWYgZW1wdHkoc2VsZik6CgkJcmV0dXJuIG5vdCBzZWxmLnN0b3JlCgoKY2xhc3MgU3luY1F1ZXVlKFRocmVhZCk6CglfX2xvY2sgPSBMb2NrKCkKCglkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZGVsYXksIHF1ZXVlKToKCQlUaHJlYWQuX19pbml0X18oc2VsZikKCQlzZWxmLm5hbWUgPSBuYW1lCgkJc2VsZi5kZWxheSA9IGRlbGF5CgkJc2VsZi5xdWV1ZSA9IHF1ZXVlCgoJZGVmIHJ1bihzZWxmKToKCQlwcmludCAiU3RhcnRpbmcgJXMiICUgc2VsZi5uYW1lCgkJd2hpbGUgbm90IHNlbGYucXVldWUuZW1wdHkoKToKCQkJd2l0aCBzZWxmLl9fbG9jazoKCQkJCXByaW50ICIlcyBnb3QgJXMiIFwKCQkJCSUgKHNlbGYubmFtZSwKCQkJCXNlbGYucXVldWUuZ2V0KCkpCgkJCXNsZWVwKHNlbGYuZGVsYXkpCgkJd2hpbGUgbm90IGpvYl9kb25lOgoJCQlzbGVlcChzZWxmLmRlbGF5KQoJCXByaW50ICJFeGl0aW5nICVzIiAlIHNlbGYubmFtZQoKZGVmIHByaW50X3RpbWUodGhyZWFkLCBkZWxheSk6Cglmb3IgaSBpbiB4cmFuZ2UoMyk6CgkJc2xlZXAoZGVsYXkpCgkJcHJpbnQgIiVzIHdva2UgdXAgYXQgJXMiICUgKHRocmVhZCwgY3RpbWUodGltZSgpKSkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Cglqb2JfZG9uZSA9IEZhbHNlCgkjcSA9IFF1ZXVlKDUpICMgUHl0aG9uJ3MgUXVldWUKCXEgPSBRdWV1ZSgpICMgQ3VzdG9tIFF1ZXVlCglmb3IgaSBpbiB4cmFuZ2UoNSk6CgkJcS5wdXQoaSkKCXExID0gU3luY1F1ZXVlKCJRMSIsIDIsIHEpCglxMiA9IFN5bmNRdWV1ZSgiUTIiLCAxLCBxKQoJcTEuc3RhcnQoKQoJcTIuc3RhcnQoKQoKCSMgV2FpdCBmb3IgdGhlIGpvYiB0byBiZSBkb25lCgl3aGlsZSBub3QgcS5lbXB0eSgpOgoJCXBhc3MKCWpvYl9kb25lID0gVHJ1ZQoJcTEuam9pbigpCglxMi5qb2luKCkKCXByaW50ICJBbGwgZG9uZSEiCg==