diff --git a/sjrpc/core/async.py b/sjrpc/core/async.py index 56e945dbc8cc9e0730f305a48a412e9f5d32d678..058b260eeae2c0328640aa3d78372bd49933378e 100644 --- a/sjrpc/core/async.py +++ b/sjrpc/core/async.py @@ -76,7 +76,19 @@ class AsyncWatcher(object): >>> for msg in watcher.wait(timeout=60): >>> process(msg) ''' - responses = [] + return list(self.iter(timeout, max_wait)) + + def iter(self, timeout=None, max_wait=None): + ''' + Work like :meth:`AsyncWatcher.wait` but return an iterable, instead of + a list object. + + .. note:: + + Responses are yielded by the iterable when they are received, so you + can start the processing of response before receiving all. + ''' + while self.remains: try: dt, response = self._get_in_queue(timeout=timeout) @@ -84,12 +96,10 @@ class AsyncWatcher(object): break if timeout is not None: timeout -= dt - responses.append(response) self._expected_responses.remove(response['id']) + yield response # Check for max_wait: if max_wait is not None: max_wait -= 1 if not max_wait: break - return responses -