class GRowsHandler(object): def __init__(self): """ Subclass of :class:`~.AsyncViewBase` This doesn't expose an API different from the normal synchronous view API. It's just implemented differently """ # We use __double_underscore to mangle names. This is because # the views class has quite a bit of data attached to it. self.__waiter = Waiter() self.__raw_rows = [] self.__done_called = False self.start() self.raw.rows_per_call = 100000 def _callback(self, *args): # This method overridden from the parent. Rather than do the processing # on demand, we must defer it for later. This is done by copying the # rows to a list. In the typical case we shouldn't accumulate all # the rows in the buffer (since .switch() will typically have something # waiting for us). However if the view is destroyed prematurely, # or if the user is not actively iterating over us, or if something # else happens (such as more rows arriving during a get request with # include_docs), we simply accumulate the rows here. self.__raw_rows.append(self.raw.rows) if self.raw.done: self._clear() self.__waiter.switch() def _errback(self, mres, *args): self._clear() self.__waiter.throw(*args) def __iter__(self): if not self._do_iter: raise AlreadyQueriedError.pyexc("Already queried") while self._do_iter and not self.__done_called: self.__waiter.get() rowset_list = self.__raw_rows self.__raw_rows = [] for rowset in rowset_list: for row in self._process_payload(rowset): yield row self._do_iter = False
class GRowsHandler(object): def __init__(self): """ Subclass of :class:`~.AsyncViewBase` This doesn't expose an API different from the normal synchronous view API. It's just implemented differently """ # We use __double_underscore to mangle names. This is because # the views class has quite a bit of data attached to it. self.__waiter = Waiter() self.__raw_rows = [] self.__done_called = False self.start() self.raw.rows_per_call = 100000 def _callback(self, *args): # This method overridden from the parent. Rather than do the processing # on demand, we must defer it for later. This is done by copying the # rows to a list. In the typical case we shouldn't accumulate all # the rows in the buffer (since .switch() will typically have something # waiting for us). However if the view is destroyed prematurely, # or if the user is not actively iterating over us, or if something # else happens (such as more rows arriving during a get request with # include_docs), we simply accumulate the rows here. self.__raw_rows.append(self.raw.rows) if self.raw.done: self._clear() self.__waiter.switch() def _errback(self, mres, *args): self._clear() self.__waiter.throw(*args) def __iter__(self): if not self._do_iter: raise AlreadyQueriedError.pyexc("Already queried") while self._do_iter and not self.__done_called: self.__waiter.get() rowset_list = self.__raw_rows self.__raw_rows = [] for rowset in rowset_list: for row in self._process_payload(rowset): yield row self._do_iter = False
def _http_request(self, **kwargs): res = super(Bucket, self)._http_request(**kwargs) w = Waiter() res.callback = lambda x: w.switch(x) res.errback = lambda x, c, o, b: w.throw(c, o, b) return w.get()
def _http_request(self, **kwargs): res = super(Bucket, self)._http_request(**kwargs) w = Waiter() res.callback = lambda x: w.switch(x) res.errback = lambda x, c, o, b: w.throw(c, o, b) return w.get()
def test(self): waiter = self.waiter self.assertEqual(str(waiter), '<Waiter greenlet=None>') waiter.switch(25) self.assertEqual(str(waiter), '<Waiter greenlet=None value=25>') self.assertEqual(waiter.get(), 25) waiter = Waiter() waiter.throw(ZeroDivisionError) assert re.match('^<Waiter greenlet=None exc_info=.*ZeroDivisionError.*$', str(waiter)), str(waiter) self.assertRaises(ZeroDivisionError, waiter.get) waiter = Waiter() gevent.spawn(waiter.get) gevent.sleep(0) assert str(waiter).startswith('<Waiter greenlet=<Greenlet at '), str(waiter)
def test(self): waiter = Waiter() self.assertEqual(str(waiter), '<Waiter greenlet=None>') waiter.switch(25) self.assertEqual(str(waiter), '<Waiter greenlet=None value=25>') self.assertEqual(waiter.get(), 25) waiter = Waiter() waiter.throw(ZeroDivisionError) assert re.match('^<Waiter greenlet=None exc_info=.*ZeroDivisionError.*$', str(waiter)), str(waiter) self.assertRaises(ZeroDivisionError, waiter.get) waiter = Waiter() g = gevent.spawn(waiter.get) gevent.sleep(0) self.assertTrue(str(waiter).startswith('<Waiter greenlet=<Greenlet "Greenlet-')) g.kill()
def test(self): waiter = Waiter() self.assertEqual(str(waiter), '<Waiter greenlet=None>') waiter.switch(25) self.assertEqual(str(waiter), '<Waiter greenlet=None value=25>') self.assertEqual(waiter.get(), 25) waiter = Waiter() waiter.throw(ZeroDivisionError) assert re.match('^<Waiter greenlet=None exc_info=.*ZeroDivisionError.*$', str(waiter)), str(waiter) self.assertRaises(ZeroDivisionError, waiter.get) waiter = Waiter() g = gevent.spawn(waiter.get) g.name = 'AName' gevent.sleep(0) str_waiter = str(waiter) self.assertTrue(str_waiter.startswith('<Waiter greenlet=<Greenlet "AName'), str_waiter) g.kill()