Advertisement
Guest User

Untitled

a guest
Apr 27th, 2015
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.68 KB | None | 0 0
  1. __author__ = 'Viacheslav Demeshko'
  2.  
  3. import threading
  4.  
  5. # Cafe multi-threading logic with BlockingQueue.
  6.  
  7.  
  8. class Client(threading.Thread):
  9.     def __init__(self, queue_soup, queue_cake, queue_coffee, mutex_soup, mutex_cake, mutex_coffee):
  10.         super().__init__()
  11.         self.queue_soup = queue_soup
  12.         self.queue_cake = queue_cake
  13.         self.queue_coffee = queue_coffee
  14.         self.mutex_soup = mutex_soup
  15.         self.mutex_cake = mutex_cake
  16.         self.mutex_coffee = mutex_coffee
  17.  
  18.     def soup_queue(self):
  19.         self.mutex_soup.acquire()
  20.         while len(self.queue_soup) == 0:
  21.             self.mutex_soup.wait()
  22.         print("client takes a soup. Soup queue size is ", len(self.queue_soup))
  23.         self.queue_soup.pop(0)
  24.         self.mutex_soup.notify()
  25.         self.mutex_soup.release()
  26.  
  27.     def cake_queue(self):
  28.         self.mutex_cake.acquire()
  29.         while len(self.queue_cake) == 0:
  30.             self.mutex_cake.wait()
  31.         print("client takes a cake. Cake queue size is ", len(self.queue_soup))
  32.         self.queue_cake.pop(0)
  33.         self.mutex_cake.notify()
  34.         self.mutex_cake.release()
  35.  
  36.     def coffee_queue(self):
  37.         self.mutex_coffee.acquire()
  38.         while len(self.queue_coffee) == 0:
  39.             self.mutex_coffee.wait()
  40.         print("client takes a coffee. Coffee queue size is ", len(self.queue_soup))
  41.         self.queue_coffee.pop(0)
  42.         self.mutex_coffee.notify()
  43.         self.mutex_coffee.release()
  44.  
  45.     def run(self):
  46.         self.soup_queue()
  47.         self.cake_queue()
  48.         self.coffee_queue()
  49.  
  50.  
  51. class SoupChief(threading.Thread):
  52.     def __init__(self, queue_soup, mutex_soup):
  53.         super().__init__()
  54.         self.queue_soup = queue_soup
  55.         self.mutex_soup = mutex_soup
  56.  
  57.     def soup_mutex(self):
  58.         self.mutex_soup.acquire()
  59.         while len(self.queue_soup) >= 10:
  60.             self.mutex_soup.wait()
  61.         print("SoupChief makes the soup. Coffee queue size is ", len(self.queue_soup))
  62.         self.queue_soup.append(10)
  63.         self.mutex_soup.notify()
  64.         self.mutex_soup.release()
  65.  
  66.     def run(self):
  67.         while True:
  68.             self.soup_mutex()
  69.  
  70.  
  71. class CakeChief(threading.Thread):
  72.     def __init__(self, queue_cake, mutex_cake):
  73.         super().__init__()
  74.         self.queue_cake = queue_cake
  75.         self.mutex_cake = mutex_cake
  76.  
  77.     def cake_mutex(self):
  78.         self.mutex_cake.acquire()
  79.         while len(self.queue_cake) >= 10:
  80.             self.mutex_cake.wait()
  81.         print("CakeChief makes the cake. Cake queue size is ", len(self.queue_cake))
  82.         self.queue_cake.append(10)
  83.         self.mutex_cake.notify()
  84.         self.mutex_cake.release()
  85.  
  86.     def run(self):
  87.         while True:
  88.             self.cake_mutex()
  89.  
  90.  
  91. class CoffeeChief(threading.Thread):
  92.     def __init__(self, queue_coffee, mutex_coffee):
  93.         super().__init__()
  94.         self.queue_coffee = queue_coffee
  95.         self.mutex_coffee = mutex_coffee
  96.  
  97.     def coffee_mutex(self):
  98.         self.mutex_coffee.acquire()
  99.         while len(self.queue_coffee) >= 10:
  100.             self.mutex_coffee.wait()
  101.         print("CoffeeChief makes the coffee. Coffee queue size is ", len(self.queue_coffee))
  102.         self.queue_coffee.append(10)
  103.         self.mutex_coffee.notify()
  104.         self.mutex_coffee.release()
  105.  
  106.     def run(self):
  107.         while True:
  108.             self.coffee_mutex()
  109.  
  110.  
  111. class Order():
  112.     def __init__(self, order):
  113.         self.order_number = order
  114.         queue_cake, queue_coffee, queue_soup = queue_init()
  115.         mutex_cake, mutex_coffee, mutex_soup = mutex_thread_init()
  116.         cake_chief, coffee_chief, soup_chief = chief_init(mutex_coffee, queue_cake, queue_coffee, queue_soup)
  117.         chief_threads_start(cake_chief, coffee_chief, soup_chief)
  118.         Client(queue_soup, queue_cake, queue_coffee, mutex_soup, mutex_cake, mutex_coffee).start()
  119.  
  120.  
  121. def queue_init():
  122.     queue_soup = []
  123.     queue_cake = []
  124.     queue_coffee = []
  125.     return queue_cake, queue_coffee, queue_soup
  126.  
  127.  
  128. def mutex_thread_init():
  129.     mutex_soup = threading.Condition()
  130.     mutex_cake = threading.Condition()
  131.     mutex_coffee = threading.Condition()
  132.     return mutex_cake, mutex_coffee, mutex_soup
  133.  
  134.  
  135. def chief_init(mutex_coffee, queue_cake, queue_coffee, queue_soup):
  136.     soup_chief = SoupChief(queue_soup, mutex_coffee)
  137.     cake_chief = CakeChief(queue_cake, mutex_coffee)
  138.     coffee_chief = CoffeeChief(queue_coffee, mutex_coffee)
  139.     return cake_chief, coffee_chief, soup_chief
  140.  
  141.  
  142. def chief_threads_start(cake_chief, coffee_chief, soup_chief):
  143.     soup_chief.start()
  144.     cake_chief.start()
  145.     coffee_chief.start()
  146.  
  147.  
  148. def main():
  149.  
  150.     for orders in range(0, 30):
  151.         Order(orders)
  152. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement