summaryrefslogtreecommitdiff
path: root/bgproc.py
blob: 690880cda62ceb8f140b6e9ccea80c3357b90ffb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 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.func = func
        self.pending_requests = 0
        self.requests = []
        self.results = []
        
    def enqueue_request(self, request):
        '''Put a request into queue, to be processed by workers whenever.'''
        self.pending_requests += 1
        self.requests.append(request)
        
    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.
        
        '''
        for request in self.requests:
            self.results.append(self.func(request))
        return len(self.results) > 0

    def __iter__(self):
        '''Iterate over immediately available results.'''
        while self.results:
            result = self.results.pop(0)
            yield result