1 |
Author: zmedico |
2 |
Date: 2008-07-30 03:07:40 +0000 (Wed, 30 Jul 2008) |
3 |
New Revision: 11275 |
4 |
|
5 |
Modified: |
6 |
main/trunk/pym/_emerge/__init__.py |
7 |
Log: |
8 |
* Optimize SequentialTaskQueue.schedule() by using a _dirty attribute |
9 |
to track whether anything relevant has changed since the last schedule |
10 |
call. Since we can always rely on exist listeners being called, set of |
11 |
running tasks is always pruned automatically and there is never any need |
12 |
to actively prune it. |
13 |
* Remove the unused SequentialTaskQueue.auto_schedule feature. |
14 |
|
15 |
|
16 |
Modified: main/trunk/pym/_emerge/__init__.py |
17 |
=================================================================== |
18 |
--- main/trunk/pym/_emerge/__init__.py 2008-07-30 02:27:53 UTC (rev 11274) |
19 |
+++ main/trunk/pym/_emerge/__init__.py 2008-07-30 03:07:40 UTC (rev 11275) |
20 |
@@ -8112,8 +8112,8 @@ |
21 |
|
22 |
class SequentialTaskQueue(SlotObject): |
23 |
|
24 |
- __slots__ = ("auto_schedule", "max_jobs", "running_tasks") + \ |
25 |
- ("_task_queue", "_scheduling") |
26 |
+ __slots__ = ("max_jobs", "running_tasks") + \ |
27 |
+ ("_dirty", "_scheduling", "_task_queue") |
28 |
|
29 |
def __init__(self, **kwargs): |
30 |
SlotObject.__init__(self, **kwargs) |
31 |
@@ -8121,19 +8121,21 @@ |
32 |
self.running_tasks = set() |
33 |
if self.max_jobs is None: |
34 |
self.max_jobs = 1 |
35 |
+ self._dirty = True |
36 |
|
37 |
def add(self, task): |
38 |
self._task_queue.append(task) |
39 |
- if self.auto_schedule: |
40 |
- self.schedule() |
41 |
+ self._dirty = True |
42 |
|
43 |
def addFront(self, task): |
44 |
self._task_queue.appendleft(task) |
45 |
- if self.auto_schedule: |
46 |
- self.schedule() |
47 |
+ self._dirty = True |
48 |
|
49 |
def schedule(self): |
50 |
|
51 |
+ if not self._dirty: |
52 |
+ return False |
53 |
+ |
54 |
if not self: |
55 |
return False |
56 |
|
57 |
@@ -8149,10 +8151,6 @@ |
58 |
max_jobs = self.max_jobs |
59 |
state_changed = False |
60 |
|
61 |
- for task in list(running_tasks): |
62 |
- if task.poll() is not None: |
63 |
- state_changed = True |
64 |
- |
65 |
while task_queue and \ |
66 |
(max_jobs is True or len(running_tasks) < max_jobs): |
67 |
task = task_queue.popleft() |
68 |
@@ -8163,14 +8161,20 @@ |
69 |
task.start() |
70 |
state_changed = True |
71 |
|
72 |
+ self._dirty = False |
73 |
self._scheduling = False |
74 |
|
75 |
return state_changed |
76 |
|
77 |
def _task_exit(self, task): |
78 |
- self.running_tasks.discard(task) |
79 |
- if self.auto_schedule: |
80 |
- self.schedule() |
81 |
+ """ |
82 |
+ Since we can always rely on exist listeners being called, set of |
83 |
+ running tasks is always pruned automatically and there is never any need |
84 |
+ to actively prune it. |
85 |
+ """ |
86 |
+ self.running_tasks.remove(task) |
87 |
+ if self._task_queue: |
88 |
+ self._dirty = True |
89 |
|
90 |
def clear(self): |
91 |
self._task_queue.clear() |
92 |
@@ -8179,6 +8183,7 @@ |
93 |
task = running_tasks.pop() |
94 |
task.removeExitListener(self._task_exit) |
95 |
task.cancel() |
96 |
+ self._dirty = False |
97 |
|
98 |
def __nonzero__(self): |
99 |
return bool(self._task_queue or self.running_tasks) |