Skip to content

Instantly share code, notes, and snippets.

@javouhey
Created January 16, 2011 09:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save javouhey/781668 to your computer and use it in GitHub Desktop.
Save javouhey/781668 to your computer and use it in GitHub Desktop.
Producer Consumer using Semaphores
"""
Producer produces numbers 1..10
Consumer runs first & then blocks
Solution: uses semaphores
"""
from threading import Thread
from threading import Semaphore
class SharedBuffer(object):
def __init__(self):
self.empty = Semaphore(0)
self.mutex = Semaphore(1)
self.slot = []
def put(self, p):
""" blocking put """
self.mutex.acquire()
try:
print "put " + str(p)
self.slot.append( p )
except:
print "failed to append"
self.mutex.release()
self.empty.release()
def get(self):
""" blocking get """
self.empty.acquire()
self.mutex.acquire()
v = self.slot.pop()
self.mutex.release()
print "get " + str(v)
return v
class Producer(Thread):
def __init__(self,buffer):
Thread.__init__(self)
self.buffer = buffer
def run(self):
print "[Producer] running"
for i in range(0, 10):
self.buffer.put( i )
print "[Producer] sent " + str(i)
print "[Producer] dead"
class Consumer(Thread):
def __init__(self,buffer):
Thread.__init__(self)
self.buffer = buffer
def run(self):
print "[Consumer] running"
while(True):
v = self.buffer.get()
print "[Consumer] received " + str(v)
if( v == 9 ):
break
print "[Consumer] dead"
if __name__ == "__main__":
buffer = SharedBuffer()
p = Producer(buffer)
c = Consumer(buffer)
c.start()
p.start()
c.join()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment