Mercurial > cpython-lru_cache-weakref
annotate Lib/sched.py @ 4566:6403c94de50d legacy-trunk
Added safeguard against failure in __del__.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Wed, 27 Nov 1996 19:39:58 +0000 |
| parents | 1940892d2fe3 |
| children | 7ed6fba8265c |
| rev | line source |
|---|---|
| 195 | 1 # Module sched -- a generally useful event scheduler class |
| 2 | |
| 3 # Each instance of this class manages its own queue. | |
| 4 # No multi-threading is implied; you are supposed to hack that | |
| 5 # yourself, or use a single instance per application. | |
| 6 # | |
| 7 # Each instance is parametrized with two functions, one that is | |
| 8 # supposed to return the current time, one that is supposed to | |
|
1746
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1435
diff
changeset
|
9 # implement a delay. You can implement real-time scheduling by |
|
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1435
diff
changeset
|
10 # substituting time and sleep from built-in module time, or you can |
|
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1435
diff
changeset
|
11 # implement simulated time by writing your own functions. This can |
|
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1435
diff
changeset
|
12 # also be used to integrate scheduling with STDWIN events; the delay |
|
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1435
diff
changeset
|
13 # function is allowed to modify the queue. Time can be expressed as |
|
218
3429c945d817
Delay zero after successful action.
Guido van Rossum <guido@python.org>
parents:
195
diff
changeset
|
14 # integers or floating point numbers, as long as it is consistent. |
| 195 | 15 |
| 16 # Events are specified by tuples (time, priority, action, argument). | |
| 17 # As in UNIX, lower priority numbers mean higher priority; in this | |
| 18 # way the queue can be maintained fully sorted. Execution of the | |
| 19 # event means calling the action function, passing it the argument. | |
| 20 # Remember that in Python, multiple function arguments can be packed | |
| 21 # in a tuple. The action function may be an instance method so it | |
| 22 # has another way to reference private data (besides global variables). | |
| 23 # Parameterless functions or methods cannot be used, however. | |
| 24 | |
|
429
bb308e7b0039
Added a comment about a possible interface change.
Guido van Rossum <guido@python.org>
parents:
218
diff
changeset
|
25 # XXX The timefunc and delayfunc should have been defined as methods |
|
bb308e7b0039
Added a comment about a possible interface change.
Guido van Rossum <guido@python.org>
parents:
218
diff
changeset
|
26 # XXX so you can define new kinds of schedulers using subclassing |
|
bb308e7b0039
Added a comment about a possible interface change.
Guido van Rossum <guido@python.org>
parents:
218
diff
changeset
|
27 # XXX instead of having to define a module or class just to hold |
|
bb308e7b0039
Added a comment about a possible interface change.
Guido van Rossum <guido@python.org>
parents:
218
diff
changeset
|
28 # XXX the global state of your particular time and delay functtions. |
|
bb308e7b0039
Added a comment about a possible interface change.
Guido van Rossum <guido@python.org>
parents:
218
diff
changeset
|
29 |
|
1006
903071377d29
Added a _v21 def to FL.py and added two new input field types
Guido van Rossum <guido@python.org>
parents:
559
diff
changeset
|
30 import bisect |
|
903071377d29
Added a _v21 def to FL.py and added two new input field types
Guido van Rossum <guido@python.org>
parents:
559
diff
changeset
|
31 |
| 531 | 32 class scheduler: |
| 195 | 33 # |
| 34 # Initialize a new instance, passing the time and delay functions | |
| 35 # | |
|
1435
560ec7030817
* Mass change: get rid of all init() methods, in favor of __init__()
Guido van Rossum <guido@python.org>
parents:
1110
diff
changeset
|
36 def __init__(self, timefunc, delayfunc): |
| 195 | 37 self.queue = [] |
| 38 self.timefunc = timefunc | |
| 39 self.delayfunc = delayfunc | |
| 40 # | |
| 41 # Enter a new event in the queue at an absolute time. | |
| 42 # Returns an ID for the event which can be used | |
| 43 # to remove it, if necessary. | |
| 44 # | |
|
1110
1d06b1499eb9
* Got entirely rid of path.py.
Guido van Rossum <guido@python.org>
parents:
1006
diff
changeset
|
45 def enterabs(self, time, priority, action, argument): |
|
1d06b1499eb9
* Got entirely rid of path.py.
Guido van Rossum <guido@python.org>
parents:
1006
diff
changeset
|
46 event = time, priority, action, argument |
|
1006
903071377d29
Added a _v21 def to FL.py and added two new input field types
Guido van Rossum <guido@python.org>
parents:
559
diff
changeset
|
47 bisect.insort(self.queue, event) |
| 195 | 48 return event # The ID |
| 49 # | |
| 50 # A variant that specifies the time as a relative time. | |
| 51 # This is actually the more commonly used interface. | |
| 52 # | |
|
1110
1d06b1499eb9
* Got entirely rid of path.py.
Guido van Rossum <guido@python.org>
parents:
1006
diff
changeset
|
53 def enter(self, delay, priority, action, argument): |
| 195 | 54 time = self.timefunc() + delay |
| 55 return self.enterabs(time, priority, action, argument) | |
| 56 # | |
| 57 # Remove an event from the queue. | |
| 58 # This must be presented the ID as returned by enter(). | |
| 59 # If the event is not in the queue, this raises RuntimeError. | |
| 60 # | |
| 61 def cancel(self, event): | |
| 62 self.queue.remove(event) | |
| 63 # | |
| 64 # Check whether the queue is empty. | |
| 65 # | |
| 66 def empty(self): | |
| 559 | 67 return len(self.queue) == 0 |
| 195 | 68 # |
| 69 # Run: execute events until the queue is empty. | |
| 70 # | |
| 71 # When there is a positive delay until the first event, the | |
| 72 # delay function is called and the event is left in the queue; | |
| 73 # otherwise, the event is removed from the queue and executed | |
| 74 # (its action function is called, passing it the argument). | |
| 75 # If the delay function returns prematurely, it is simply | |
| 76 # restarted. | |
| 77 # | |
| 78 # It is legal for both the delay function and the action | |
| 79 # function to to modify the queue or to raise an exception; | |
| 80 # exceptions are not caught but the scheduler's state | |
| 81 # remains well-defined so run() may be called again. | |
| 82 # | |
|
218
3429c945d817
Delay zero after successful action.
Guido van Rossum <guido@python.org>
parents:
195
diff
changeset
|
83 # A questionably hack is added to allow other threads to run: |
|
3429c945d817
Delay zero after successful action.
Guido van Rossum <guido@python.org>
parents:
195
diff
changeset
|
84 # just after an event is executed, a delay of 0 is executed, |
|
3429c945d817
Delay zero after successful action.
Guido van Rossum <guido@python.org>
parents:
195
diff
changeset
|
85 # to avoid monopolizing the CPU when other threads are also |
|
3429c945d817
Delay zero after successful action.
Guido van Rossum <guido@python.org>
parents:
195
diff
changeset
|
86 # runnable. |
|
3429c945d817
Delay zero after successful action.
Guido van Rossum <guido@python.org>
parents:
195
diff
changeset
|
87 # |
| 195 | 88 def run(self): |
| 89 q = self.queue | |
| 90 while q: | |
| 91 time, priority, action, argument = q[0] | |
| 92 now = self.timefunc() | |
| 93 if now < time: | |
| 94 self.delayfunc(time - now) | |
| 95 else: | |
| 96 del q[0] | |
|
1110
1d06b1499eb9
* Got entirely rid of path.py.
Guido van Rossum <guido@python.org>
parents:
1006
diff
changeset
|
97 void = apply(action, argument) |
|
218
3429c945d817
Delay zero after successful action.
Guido van Rossum <guido@python.org>
parents:
195
diff
changeset
|
98 self.delayfunc(0) # Let other threads run |
| 195 | 99 # |
