import simpy
import random


class Philosopher(object):
    def __init__(self, env, name='Fils'):
        self.name = name  # Имя
        self.env = env  # Среда моделирования
        
    def run(self):
        while True:
            thinkingtime = random.uniform(0.2, 1.5) * thinkingtime_mean
            eatingtime = random.uniform(0.2, 1.1) * eatingtime_mean
            print (self.name+" thinking")
            yield self.env.timeout(thinkingtime)
            
            reqleft =self.leftfork.request()
            reqright=self.rightfork.request()
            print (self.name+" waiting")
            yield reqleft | reqright
            
            print (self.name+" eating")
            yield self.env.timeout(eatingtime)
            
            self.rightfork.release(reqright)
            self.leftfork.release(reqleft)

eatingtime_mean = 10
thinkingtime_mean = 12
nphilosophers = 7
philosopherNames = ('1:Kant:','2:Marx:','3:Plato:','4:Russo:','5:Sockrat:',
   '6:Pifagor:','7:Hegel:','8:Voltair:','9:Dekart:','10:LaoZi:','11:Russel:')
random.seed(12345)

# Инициализация среды моделирования
env = simpy.Environment()
philosopher = []
fork = []
# prep list of filos
for i in range(nphilosophers):
    philosopher.append(Philosopher(env,philosopherNames[i]))
    fork.append(simpy.Resource(env))
    if i != 0: philosopher[i].leftfork = fork[i - 1]
    philosopher[i].rightfork = fork[i]
philosopher[0].leftfork = fork[nphilosophers - 1]
# activate processes
for i in range(nphilosophers):
    env.process(philosopher[i].run())

env.run(until=500)
print("_that's all folks_!_")
