prioritizedLoadManager.py (2896B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\script\util\prioritizedLoadManager.py 2 import sys 3 import log 4 import stackless 5 import uthread 6 from carbon.common.script.sys.service import Service 7 8 class Heap(object): 9 10 def __init__(self, key): 11 self.entries = [] 12 self.key = key 13 14 def sort(self): 15 self.entries.sort(key=self.key) 16 17 def push(self, v): 18 self.entries.append(v) 19 20 def pop(self): 21 self.sort() 22 return self.entries.pop() 23 24 def __contains__(self, o): 25 return o in self.entries 26 27 def __len__(self): 28 return len(self.entries) 29 30 def clear(self): 31 self.entries = [] 32 33 def remove(self, o): 34 self.entries.remove(o) 35 36 37 class PriorityQueue(Heap): 38 39 def __init__(self): 40 Heap.__init__(self, lambda entry: entry.GetPriority()) 41 self.chan = stackless.channel() 42 43 def put(self, x): 44 if self.chan.balance < 0: 45 self.chan.send(x) 46 else: 47 self.push(x) 48 49 def get(self): 50 if len(self): 51 return self.pop() 52 else: 53 return self.chan.receive() 54 55 def getAll(self): 56 self.sort() 57 return reversed(self.entries) 58 59 60 class PrioritizedLoadManager(Service): 61 __guid__ = 'svc.prioritizedLoadManager' 62 MAX_TASKLETS = 4 63 64 def __init__(self, *args, **kwargs): 65 Service.__init__(self, *args, **kwargs) 66 self.queue = PriorityQueue() 67 self.requestsByOwner = {} 68 self.isRunning = True 69 self.tasklets = [] 70 for i in xrange(self.MAX_TASKLETS): 71 tasklet = uthread.new(self.Dispatcher) 72 tasklet.context = 'svc.prioritizedLoadManager::Dispatcher' 73 self.tasklets.append(tasklet) 74 75 def Stop(self, *args, **kwargs): 76 self.isRunning = False 77 Service.Stop(*args, **kwargs) 78 79 def Add(self, owner, request): 80 if owner: 81 if owner in self.requestsByOwner: 82 self.Cancel(owner) 83 request.owner = owner 84 self.requestsByOwner[owner] = request 85 self.queue.put(request) 86 87 def Cancel(self, owner): 88 if owner in self.requestsByOwner: 89 request = self.requestsByOwner[owner] 90 del self.requestsByOwner[owner] 91 self.queue.remove(request) 92 93 def Dispatcher(self): 94 while self.isRunning: 95 try: 96 request = self.queue.get() 97 self.ProcessRequest(request) 98 request = None 99 except Exception: 100 log.LogException() 101 sys.exc_clear() 102 103 def ProcessRequest(self, request): 104 if request.owner: 105 del self.requestsByOwner[request.owner] 106 request.Process() 107 108 def GetLoadRequestInfo(self): 109 return [ (entry.GetName(), entry.GetPriority()) for entry in self.queue.getAll() ]