Advertisement
pasholnahuy

Untitled

Dec 23rd, 2023 (edited)
746
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.08 KB | None | 0 0
  1. import asyncio
  2. import threading
  3. import time
  4. import random
  5.  
  6. num_philosophers = 6
  7.  
  8. class Dinner:
  9.     def __init__(self, num_philosophers):
  10.         self.forks = [threading.Lock() for i in range(num_philosophers)]
  11.         self.counts = [0 for i in range(num_philosophers)]
  12.  
  13.  
  14.     def finished(self):
  15.         if all([i >= 5 for i in self.counts]):
  16.             return True
  17.         return False
  18.  
  19.  
  20.     @staticmethod
  21.     def think():
  22.         # Подумали случайное время, это может быть полезно менять в рамках самотестирования
  23.         time.sleep(0.15 * random.random())
  24.  
  25.     @staticmethod
  26.     def eat():
  27.         # Покушали случайное время, это может быть полезно менять в рамках самотестирования
  28.         time.sleep(0.25 * random.random())
  29.  
  30.  
  31.     def philosopher(self, i):
  32.         while not self.finished():
  33.           if i % 2 == 0:
  34.               while self.forks[i].locked():
  35.                   self.think()
  36.               self.forks[i].acquire()
  37.               while self.forks[(i + 1) % num_philosophers].locked():
  38.                     self.think()
  39.               self.forks[(i+1) % num_philosophers].acquire()
  40.               self.eat()
  41.               self.counts[i] += 1
  42.               self.forks[i].release()
  43.               self.forks[(i+1) % num_philosophers].release()
  44.  
  45.           else:
  46.               while self.forks[(i + 1) % num_philosophers].locked():
  47.                     self.think()
  48.               self.forks[(i+1) % num_philosophers].acquire()
  49.               while self.forks[i].locked():
  50.                   self.think()
  51.               self.forks[i].acquire()
  52.               self.eat()
  53.               self.counts[i] += 1
  54.               self.forks[i].release()
  55.               self.forks[(i+1) % num_philosophers].release()
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63. dinner = Dinner(num_philosophers)
  64. philosophers = [threading.Thread(target=dinner.philosopher, args=(i,)) for i in range(num_philosophers)]
  65. for p in philosophers:
  66.     p.start()
  67. for p in philosophers:
  68.     p.join()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement