home *** CD-ROM | disk | FTP | other *** search
/ Chip 2006 June / CHIP 2006-06.2.iso / program / freeware / Democracy-0.8.2.exe / xulrunner / python / scheduler.py < prev    next >
Encoding:
Python Source  |  2006-04-10  |  2.4 KB  |  95 lines

  1. from threading import Thread, Semaphore
  2. from database import DynamicDatabase,DDBObject
  3. from time import time, sleep
  4. import threadpriority
  5.  
  6. def now():
  7.     return int(time())
  8.  
  9. # This should be higher than the number of feeds and simultaneous downloads
  10. maxThreads = 100
  11. semaphore = Semaphore(maxThreads)
  12.  
  13. ##
  14. # Database of background tasks to be periodically run
  15. class Scheduler(DynamicDatabase):
  16.     def __init__(self):
  17.         DynamicDatabase.__init__(self)
  18.         self.isShutdown = False
  19.         thread = Thread(target = self.executeEvents)
  20.         thread.setName("Scheduler")
  21.     thread.setDaemon(False)
  22.     thread.start()
  23.  
  24.     ##
  25.     # Call this to shutdown the scheduler
  26.     def shutdown(self):
  27.     self.isShutdown = True
  28.     
  29.     ##
  30.     # Executes all pending events
  31.     def executeEvents(self):
  32.     while not self.isShutdown:
  33.         self.beginUpdate()
  34.         try:
  35.         self.resetCursor()
  36.         for event in self:
  37.             if event.nextRun() <= 0:
  38.             event.lastRun = now()
  39.             if not event.repeat:
  40.                 event.remove()
  41.             t = Thread(target = event.execute,
  42.                                    name = "Scheduler exec event")
  43.             t.setDaemon(False)
  44.             t.start()
  45.         finally:
  46.         self.endUpdate()
  47.         sleep(1)
  48.  
  49.     def __getstate__(self):
  50.         assert(0) #This should never be serialized
  51.  
  52. ##
  53. # a ScheduleEvent corresponds to something that happens in the
  54. # future, possibly periodically
  55.  
  56. class ScheduleEvent(DDBObject):
  57.     scheduler = Scheduler()
  58.  
  59.     ##
  60.     # Schedules an event for interval seconds from now
  61.     # Repeats every
  62.     def __init__(self,interval, event, repeat = True):
  63.         self.interval = int(interval)
  64.         self.event = event
  65.         self.repeat = repeat
  66.         self.lastRun = now()
  67.         DDBObject.__init__(self,ScheduleEvent.scheduler)
  68.  
  69.     ##
  70.     # Returns number of seconds until next run
  71.     def nextRun(self):
  72.         self.beginRead()
  73.         try:
  74.             ret = self.interval + self.lastRun - now()
  75.         finally:
  76.             self.endRead()
  77.         return ret
  78.  
  79.     ##
  80.     # Makes an event happen
  81.     def execute(self):
  82.         #print "Spawning %s" % str(self.event)
  83.  
  84.         threadpriority.setBackgroundPriority()
  85.         semaphore.acquire()
  86.         try:
  87.             self.event()
  88.         finally:
  89.             semaphore.release()
  90.         #print "%s finished " % str(self.event)
  91.         threadpriority.setBackgroundPriority()
  92.  
  93.     def __getstate__(self):
  94.         assert(0) #This should never be serialized
  95.