NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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() ]