Advertisement
dimonbb

Untitled

Oct 18th, 2016
405
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.21 KB | None | 0 0
  1. import threading
  2.  
  3. class Order:
  4.     def __init__(self, id, dt, **attrs):
  5.         self.id = id
  6.         self.dt = dt
  7.         for k, v in attrs.items():
  8.             setattr(self, k, v)
  9.         self.intervals = iter((10, 10, 10, 20, 100))
  10.        
  11.     def next_interval(self):
  12.         try:
  13.             return next(self.intervals)
  14.         except StopIteration: return None
  15.  
  16.            
  17. class OrderView:
  18.     def __init__(self, order):
  19.         self.order = order
  20.        
  21.     def __getattr__(self, attr):
  22.         return getattr(self.order, attr)
  23.    
  24.  
  25. class OrderTransform:
  26.     __transforms = []
  27.     def __init__(self, driver):
  28.         self.driver = driver
  29.         self.transforms = [t(driver) for t in OrderTransform.__transforms if t.driver_match(driver)]
  30.        
  31.     def do(self, order):
  32.         for t in self.transforms:
  33.             order = t.do(OrderView(order))
  34.         return order
  35.        
  36.     @staticmethod
  37.     def register(transform):
  38.         OrderTransform.__transforms.append(transform)
  39.    
  40.            
  41. @OrderTransform.register
  42. class Lazy1:
  43.     def __init__(self, driver):
  44.         self.driver = driver
  45.        
  46.     @staticmethod
  47.     def driver_match(driver):
  48.         if driver.lazy1: return True
  49.        
  50.     def do(self, order_view):
  51.         order_view.dt += 3
  52.         return order_view
  53.    
  54.  
  55. @OrderTransform.register
  56. class Lazy2:
  57.     def __init__(self, driver):
  58.         self.driver = driver
  59.        
  60.     @staticmethod
  61.     def driver_match(driver):
  62.         if driver.lazy2: return True
  63.        
  64.     def do(self, order_view):
  65.         order_view.dt += 5
  66.         if self.driver.lazy2 and self.driver.lazy1: return None
  67.         return order_view
  68.        
  69. class Driver:
  70.     def __init__(self, id, **attrs):
  71.         self.id = id
  72.         for k, v in attrs.items():
  73.             setattr(self, k, v)
  74.            
  75.         self.orders = {}
  76.         self.update_transforms()        
  77.        
  78.    
  79.     def match(self, order):
  80.         new_order = self.transform.do(order)
  81.         if not new_order:
  82.             if order.id in self.orders: self.orders.pop(order.id)
  83.         else:
  84.             self.orders[new_order.id] = new_order
  85.    
  86.     def update_transforms(self):
  87.         self.transform = OrderTransform(self)
  88.  
  89. orders = set()
  90. drivers = set()
  91.  
  92. def init():
  93.     drivers.update({
  94.         Driver(1, lazy1=True, lazy2=False),
  95.         Driver(2, lazy1=False, lazy2=True),
  96.         Driver(3, lazy1=True, lazy2=True),
  97.     }) #откуда то их прочитали
  98.  
  99.     orders.update({
  100.         Order(1, 10, a1='a1', a2='a2'),
  101.         Order(2, 10, a1='b1', a2='b2'),
  102.     }) #где-то достали
  103.  
  104.     for o in orders:
  105.         for d in drivers:
  106.             d.match(o)
  107.    
  108. def new_order(order):
  109.     #матчим на водителей
  110.     for d in drivers:
  111.         d.match(o)
  112.        
  113.     #обновляем в списке заказов
  114.     orders.add(order)
  115.    
  116.     #ставим в очередь на таймер, если есть куда
  117.     next_run = order.next_interval()
  118.     if next_run:
  119.         threading.Timer(next_run, new_order, args=(order,))    
  120.    
  121. def new_driver(driver):
  122.     for o in orders:
  123.         driver.match(o)
  124.     drivers.add(driver)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement