summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2011-05-25 17:09:37 +0100
committerLars Wirzenius <liw@liw.fi>2011-05-25 17:09:37 +0100
commit74e1e4396f72c37c888eac3db163b471ecbedc6a (patch)
tree7f905a2ce8c2861703a4520784ee9f8f6667e290
downloadbgproc-74e1e4396f72c37c888eac3db163b471ecbedc6a.tar.gz
Initial draft of API for background processing.
-rw-r--r--Makefile10
-rw-r--r--bgproc.py47
-rw-r--r--bgproc_tests.py36
-rw-r--r--example.py35
-rw-r--r--without-tests1
5 files changed, 129 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..7e2cd62
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,10 @@
+PYTHON = python
+
+all:
+
+check: all
+ $(PYTHON) -m CoverageTestRunner --ignore-missing-from=without-tests
+ rm .coverage
+
+clean:
+ rm -f *.py[co]
diff --git a/bgproc.py b/bgproc.py
new file mode 100644
index 0000000..6f7c4c5
--- /dev/null
+++ b/bgproc.py
@@ -0,0 +1,47 @@
+# Copyright 2011 Lars Wirzenius
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+class BackgroundProcessing(object):
+
+ '''Manage background processing queues.'''
+
+ def __init__(self, func):
+ self.pending_requests = 0
+
+ def enqueue_request(self, request):
+ '''Put a request into queue, to be processed by workers whenever.'''
+
+ def close_requests(self):
+ '''Signal workers that they can retire.
+
+ All pending requests will be processed, but after the queue
+ is empty, the workers will finish. No more requests may be
+ enqueued.
+
+ '''
+
+ def wait_for_results(self):
+ '''Block until there are results available.
+
+ No blocking if results are already available.
+ Return True if there are results available,
+ False if there will be no more results,
+ because all requests have been processed.
+
+ '''
+
+ def __iter__(self):
+ '''Iterate over immediately available results.'''
diff --git a/bgproc_tests.py b/bgproc_tests.py
new file mode 100644
index 0000000..4e1a87e
--- /dev/null
+++ b/bgproc_tests.py
@@ -0,0 +1,36 @@
+# Copyright 2011 Lars Wirzenius
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+import unittest
+
+import bgproc
+
+
+requests = []
+
+def callback(request):
+ requests.append(request)
+ return len(requests)
+
+
+class BackgroundProcessingTests(unittest.TestCase):
+
+ def setUp(self):
+ del requests[:]
+ self.bg = bgproc.BackgroundProcessing(callback)
+
+ def test_no_pending_requests_initially(self):
+ self.assertEqual(self.bg.pending_requests, 0)
diff --git a/example.py b/example.py
new file mode 100644
index 0000000..88a2dbe
--- /dev/null
+++ b/example.py
@@ -0,0 +1,35 @@
+#!/usr/bin/python
+# Copyright 2011 Lars Wirzenius
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+import bgproc
+
+
+N = 10
+
+
+def inc(request):
+ return request + 1
+
+
+bg = bgproc.BackgroundProcessing(inc)
+for i in range(N):
+ bg.enqueue_request(i)
+bg.close_requests()
+while bg.wait_for_results():
+ for result in bg:
+ print result
+
diff --git a/without-tests b/without-tests
new file mode 100644
index 0000000..a73a36d
--- /dev/null
+++ b/without-tests
@@ -0,0 +1 @@
+./example.py