Example #1
0
 def _do_read(self):
     for _ in xrange(self.max_accept):
         if self.full():
             self.stop_accepting()
             return
         try:
             args = self.do_read()
             self.delay = self.min_delay
             if not args:
                 return
         except:
             self.loop.handle_error(self, *sys.exc_info())
             ex = sys.exc_info()[1]
             if self.is_fatal_error(ex):
                 self.close()
                 sys.stderr.write('ERROR: %s failed with %s\n' % (self, str(ex) or repr(ex)))
                 return
             if self.delay >= 0:
                 self.stop_accepting()
                 self._timer = self.loop.timer(self.delay)
                 self._timer.start(self._start_accepting_if_started)
                 self.delay = min(self.max_delay, self.delay * 2)
             break
         else:
             try:
                 self.do_handle(*args)
             except:
                 self.loop.handle_error((args[1:], self), *sys.exc_info())
                 if self.delay >= 0:
                     self.stop_accepting()
                     self._timer = self.loop.timer(self.delay)
                     self._timer.start(self._start_accepting_if_started)
                     self.delay = min(self.max_delay, self.delay * 2)
                 break
Example #2
0
 def _do_read(self):
     for _ in xrange(self.max_accept):
         if self.full():
             self.stop_accepting()
             return
         try:
             args = self.do_read()
             self.delay = self.min_delay
             if not args:
                 return
         except:
             self.loop.handle_error(self, *sys.exc_info())
             ex = sys.exc_info()[1]
             if self.is_fatal_error(ex):
                 self.close()
                 sys.stderr.write('ERROR: %s failed with %s\n' %
                                  (self, str(ex) or repr(ex)))
                 return
             if self.delay >= 0:
                 self.stop_accepting()
                 self._timer = self.loop.timer(self.delay)
                 self._timer.start(self._start_accepting_if_started)
                 self.delay = min(self.max_delay, self.delay * 2)
             break
         else:
             try:
                 self.do_handle(*args)
             except:
                 self.loop.handle_error((args[1:], self), *sys.exc_info())
                 if self.delay >= 0:
                     self.stop_accepting()
                     self._timer = self.loop.timer(self.delay)
                     self._timer.start(self._start_accepting_if_started)
                     self.delay = min(self.max_delay, self.delay * 2)
                 break
Example #3
0
def iwait(objects, timeout=None, count=None):
    """
    Iteratively yield *objects* as they are ready, until all (or *count*) are ready
    or *timeout* expired.

    :param objects: A sequence (supporting :func:`len`) containing objects
        implementing the wait protocol (rawlink() and unlink()).
    :keyword int count: If not `None`, then a number specifying the maximum number
        of objects to wait for. If ``None`` (the default), all objects
        are waited for.
    :keyword float timeout: If given, specifies a maximum number of seconds
        to wait. If the timeout expires before the desired waited-for objects
        are available, then this method returns immediately.

    .. seealso:: :func:`wait`

    .. versionchanged:: 1.1a1
       Add the *count* parameter.
    .. versionchanged:: 1.1a2
       No longer raise :exc:`LoopExit` if our caller switches greenlets
       in between items yielded by this function.
    """
    # QQQ would be nice to support iterable here that can be generated slowly (why?)
    if objects is None:
        yield get_hub().join(timeout=timeout)
        return

    count = len(objects) if count is None else min(count, len(objects))
    waiter = _MultipleWaiter()
    switch = waiter.switch

    if timeout is not None:
        timer = get_hub().loop.timer(timeout, priority=-1)
        timer.start(switch, _NONE)

    try:
        for obj in objects:
            obj.rawlink(switch)

        for _ in xrange(count):
            item = waiter.get()
            waiter.clear()
            if item is _NONE:
                return
            yield item
    finally:
        if timeout is not None:
            timer.close()
        for aobj in objects:
            unlink = getattr(aobj, 'unlink', None)
            if unlink:
                try:
                    unlink(switch)
                except: # pylint:disable=bare-except
                    traceback.print_exc()
Example #4
0
def iwait(objects, timeout=None, count=None):
    """
    Iteratively yield *objects* as they are ready, until all (or *count*) are ready
    or *timeout* expired.

    :param objects: A sequence (supporting :func:`len`) containing objects
        implementing the wait protocol (rawlink() and unlink()).
    :keyword int count: If not `None`, then a number specifying the maximum number
        of objects to wait for. If ``None`` (the default), all objects
        are waited for.
    :keyword float timeout: If given, specifies a maximum number of seconds
        to wait. If the timeout expires before the desired waited-for objects
        are available, then this method returns immediately.

    .. seealso:: :func:`wait`

    .. versionchanged:: 1.1a1
       Add the *count* parameter.
    .. versionchanged:: 1.1a2
       No longer raise :exc:`LoopExit` if our caller switches greenlets
       in between items yielded by this function.
    """
    # QQQ would be nice to support iterable here that can be generated slowly (why?)
    if objects is None:
        yield get_hub().join(timeout=timeout)
        return

    count = len(objects) if count is None else min(count, len(objects))
    waiter = _MultipleWaiter()
    switch = waiter.switch

    if timeout is not None:
        timer = get_hub().loop.timer(timeout, priority=-1)
        timer.start(switch, _NONE)

    try:
        for obj in objects:
            obj.rawlink(switch)

        for _ in xrange(count):
            item = waiter.get()
            waiter.clear()
            if item is _NONE:
                return
            yield item
    finally:
        if timeout is not None:
            timer.stop()
        for aobj in objects:
            unlink = getattr(aobj, 'unlink', None)
            if unlink:
                try:
                    unlink(switch)
                except: # pylint:disable=bare-except
                    traceback.print_exc()