]> defiant.homedns.org Git - pyshared.git/blob - scheduler.py
Bootloader: Allow to set i2c addr
[pyshared.git] / scheduler.py
1 #!/usr/bin/env python
2 # -*- coding: iso-8859-15 -*-
3
4 import logging
5 import threading
6 from time import sleep
7
8
9 logger = logging.getLogger(__name__)
10
11 class Scheduler:
12         def __init__(self):
13                 self.lThreads = []
14                 self.pause = False
15                 self.autoclean()
16
17         def autoclean(self):
18                 logger.debug("Current number of threads: %d" % threading.active_count())
19                 self.add_thread(10, self.autoclean)
20                 for t in self.lThreads:
21                         if not t.isAlive():
22                                 self.lThreads.remove(t)
23
24         def stop(self):
25                 for t in self.lThreads:
26                         t.cancel()
27
28         def add_thread(self, time, function, args=[], kwargs={}):
29                 while(self.pause):
30                         sleep(1)
31                 k = [function, None, args, kwargs]
32                 t = threading.Timer(time, self.dispatch, k)
33                 t.setDaemon(True)
34                 t.setName(str(function))
35                 k[1] = t
36                 t.start()
37                 self.lThreads.append(t)
38
39         def dispatch(self, function, timer, args, kwargs):
40                 timer.timeup = True
41                 while True:
42                         still_running = False
43                         for t in self.lThreads:
44                                 if t.name == str(function) and t.isAlive() and t.ident != timer.ident:
45                                         still_running = True
46                                         break
47                         if not still_running:
48                                 break
49                         logger.debug("Delaying execution of Thread %s", t.name)
50                         # Another Thread still running, delay execution
51                         sleep(0.1)
52                 try:
53                         function(*args, **kwargs)
54                 except:
55                         logger.exception("Dispatcher exception of %s:", t.name)
56                         logger.error("Current number of threads: %d" % threading.active_count())
57
58
59 pScheduler = Scheduler()
60
61 if __name__ == "__main__":
62         logging.basicConfig(level=logging.DEBUG)
63         def test():
64                 pScheduler.add_thread(0.1, test)
65                 print "test"
66                 sleep(1)
67                 print "end"
68         test()
69
70         while(1):
71                 sleep(0.1)