[kupfer] task: Task and TaskRunner for async mainloop Tasks



commit df2496a95423b2c4c919cb841a9d2e76ea18d406
Author: Ulrik Sverdrup <ulrik sverdrup gmail com>
Date:   Sat Aug 22 21:52:18 2009 +0200

    task: Task and TaskRunner for async mainloop Tasks

 kupfer/task.py |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 60 insertions(+), 0 deletions(-)
---
diff --git a/kupfer/task.py b/kupfer/task.py
new file mode 100644
index 0000000..c546dca
--- /dev/null
+++ b/kupfer/task.py
@@ -0,0 +1,60 @@
+from kupfer import scheduler, pretty
+
+class Task (object):
+	"""Represent a task that can be done in the background"""
+	def __init__(self, name):
+		self.name = name
+
+	def run(self):
+		raise NotImplementedError
+
+class StepTask (Task):
+	"""A step task runs a part of the task in StepTask.step,
+	doing final cleanup in StepTask.finish, which is guaranteed to
+	be called regardless of exit or failure mode
+	"""
+	def step(self):
+		pass
+	def finish(self):
+		pass
+	def run(self):
+		try:
+			while True:
+				if not self.step():
+					break
+				yield
+		finally:
+			self.finish()
+
+
+def _step_task(task):
+	try:
+		task.next()
+	except StopIteration:
+		return False
+	else:
+		return True
+
+class TaskRunner (pretty.OutputMixin):
+	"""Run Tasks in the idle Loop"""
+	def __init__(self, end_on_finish):
+		scheduler.GetScheduler().connect("finish", self._on_finish)
+		self.task_iters = []
+		self.timer = scheduler.Timer(True)
+		self.end_on_finish = end_on_finish
+	def add_task(self, task):
+		"""Register @task to be run"""
+		self.task_iters.append(task.run())
+		self.timer.set_idle(self._step_tasks)
+	def _step_tasks(self):
+		for task in list(self.task_iters):
+			if not _step_task(task):
+				self.output_debug("Task done:", task)
+				self.task_iters.remove(task)
+		if self.task_iters:
+			self.timer.set_idle(self._step_tasks)
+
+	def _on_finish(self, sched):
+		if self.end_on_finish:
+			del self.task_iters[:]
+



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]