From 74e1e4396f72c37c888eac3db163b471ecbedc6a Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Wed, 25 May 2011 17:09:37 +0100 Subject: Initial draft of API for background processing. --- Makefile | 10 ++++++++++ bgproc.py | 47 +++++++++++++++++++++++++++++++++++++++++++++++ bgproc_tests.py | 36 ++++++++++++++++++++++++++++++++++++ example.py | 35 +++++++++++++++++++++++++++++++++++ without-tests | 1 + 5 files changed, 129 insertions(+) create mode 100644 Makefile create mode 100644 bgproc.py create mode 100644 bgproc_tests.py create mode 100644 example.py create mode 100644 without-tests 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 . + + +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 . + + +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 . + + +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 -- cgit v1.2.1