Skip to content

Instantly share code, notes, and snippets.

@cristipufu
Last active February 28, 2017 23:59
Show Gist options
  • Save cristipufu/779e13e45f02d12f7efa3038e477cdfc to your computer and use it in GitHub Desktop.
Save cristipufu/779e13e45f02d12f7efa3038e477cdfc to your computer and use it in GitHub Desktop.
dining_philosophers.py
import sys
import random
import time
from threading import *
class Philosopher(Thread):
def __init__(self, waiter, lfork, rfork):
Thread.__init__(self)
self.waiter = waiter
self.lfork = lfork
self.rfork = rfork
def acquire_forks(self):
self.waiter.acquire()
self.lfork.acquire()
self.rfork.acquire()
def release_forks(self):
self.lfork.release()
self.rfork.release()
self.waiter.release()
def think(self):
time.sleep(random.uniform(0, 3))
def eat(self):
print "{}: i am eating".format(self.name)
time.sleep(random.uniform(0, 3))
def run(self):
#while 1:
for i in range(50):
self.think()
self.acquire_forks()
self.eat()
self.release_forks()
if __name__ == "__main__":
if len(sys.argv) != 2:
sys.exit(0)
count = int(sys.argv[1])
philosophers = []
forks = [Semaphore(1) for i in xrange(count)]
waiter = Semaphore(count - 1)
for i in range(count):
philosophers.append(Philosopher(waiter, forks[i], forks[(i + 1) % count]))
for p in philosophers:
p.start()
for p in philosophers:
p.join()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment