Esempio n. 1
0
    def put(self, item, block=True, timeout=None):
        """Put an item into the queue.

        If optional arg `block` is true and `timeout` is ``None`` (the default),
        block if necessary until a free slot is available. If `timeout` is
        a positive number, it blocks at most `timeout` seconds and raises
        the :class:`queue.Full` exception if no free slot was available within that time.
        Otherwise (`block` is false), put an item on the queue if a free slot
        is immediately available, else raise the :class:`queue.Full` exception (`timeout`
        is ignored in that case).
        """
        if self.maxsize is None or self.qsize() < self.maxsize:
            # there's a free slot, put an item right away
            self._put(item)
            if self.getters:
                self._schedule_unlock()
        elif not block and get_hub() is greenlet.getcurrent():
            # we're in the mainloop, so we cannot wait; we can switch() to other greenlets though
            # find a getter and deliver an item to it
            while self.getters:
                getter = self.getters.pop()
                if getter:
                    self._put(item)
                    item = self._get()
                    getter.switch(item)
                    return
            raise Full
        elif block:
            waiter = ItemWaiter(item)
            self.putters.add(waiter)
            timeout = Timeout(timeout, Full)
            try:
                if self.getters:
                    self._schedule_unlock()
                result = waiter.wait()
                assert result is waiter, "Invalid switch into Queue.put: %r" % (
                    result, )
                if waiter.item is not _NONE:
                    self._put(item)
            finally:
                timeout.cancel()
                self.putters.discard(waiter)
        else:
            raise Full
Esempio n. 2
0
File: queue.py Progetto: dmdm/guv
    def put(self, item, block=True, timeout=None):
        """Put an item into the queue.

        If optional arg `block` is true and `timeout` is ``None`` (the default),
        block if necessary until a free slot is available. If `timeout` is
        a positive number, it blocks at most `timeout` seconds and raises
        the :class:`queue.Full` exception if no free slot was available within that time.
        Otherwise (`block` is false), put an item on the queue if a free slot
        is immediately available, else raise the :class:`queue.Full` exception (`timeout`
        is ignored in that case).
        """
        if self.maxsize is None or self.qsize() < self.maxsize:
            # there's a free slot, put an item right away
            self._put(item)
            if self.getters:
                self._schedule_unlock()
        elif not block and get_hub() is greenlet.getcurrent():
            # we're in the mainloop, so we cannot wait; we can switch() to other greenlets though
            # find a getter and deliver an item to it
            while self.getters:
                getter = self.getters.pop()
                if getter:
                    self._put(item)
                    item = self._get()
                    getter.switch(item)
                    return
            raise Full
        elif block:
            waiter = ItemWaiter(item)
            self.putters.add(waiter)
            timeout = Timeout(timeout, Full)
            try:
                if self.getters:
                    self._schedule_unlock()
                result = waiter.wait()
                assert result is waiter, "Invalid switch into Queue.put: %r" % (result, )
                if waiter.item is not _NONE:
                    self._put(item)
            finally:
                timeout.cancel()
                self.putters.discard(waiter)
        else:
            raise Full
Esempio n. 3
0
    def get(self, block=True, timeout=None):
        """Remove and return an item from the queue.

        If optional args `block` is true and `timeout` is ``None`` (the default),
        block if necessary until an item is available. If `timeout` is a positive number,
        it blocks at most `timeout` seconds and raises the :class:`queue.Empty` exception
        if no item was available within that time. Otherwise (`block` is false), return
        an item if one is immediately available, else raise the :class:`queue.Empty` exception
        (`timeout` is ignored in that case).
        """
        if self.qsize():
            if self.putters:
                self._schedule_unlock()
            return self._get()
        elif not block and get_hub() is greenlet.getcurrent():
            # special case to make get_nowait() runnable in the mainloop greenlet
            # there are no items in the queue; try to fix the situation by unlocking putters
            while self.putters:
                putter = self.putters.pop()
                if putter:
                    putter.switch(putter)
                    if self.qsize():
                        return self._get()
            raise Empty
        elif block:
            waiter = Waiter()
            timeout = Timeout(timeout, Empty)
            try:
                self.getters.add(waiter)
                if self.putters:
                    self._schedule_unlock()
                return waiter.wait()
            finally:
                self.getters.discard(waiter)
                timeout.cancel()
        else:
            raise Empty
Esempio n. 4
0
File: queue.py Progetto: dmdm/guv
    def get(self, block=True, timeout=None):
        """Remove and return an item from the queue.

        If optional args `block` is true and `timeout` is ``None`` (the default),
        block if necessary until an item is available. If `timeout` is a positive number,
        it blocks at most `timeout` seconds and raises the :class:`queue.Empty` exception
        if no item was available within that time. Otherwise (`block` is false), return
        an item if one is immediately available, else raise the :class:`queue.Empty` exception
        (`timeout` is ignored in that case).
        """
        if self.qsize():
            if self.putters:
                self._schedule_unlock()
            return self._get()
        elif not block and get_hub() is greenlet.getcurrent():
            # special case to make get_nowait() runnable in the mainloop greenlet
            # there are no items in the queue; try to fix the situation by unlocking putters
            while self.putters:
                putter = self.putters.pop()
                if putter:
                    putter.switch(putter)
                    if self.qsize():
                        return self._get()
            raise Empty
        elif block:
            waiter = Waiter()
            timeout = Timeout(timeout, Empty)
            try:
                self.getters.add(waiter)
                if self.putters:
                    self._schedule_unlock()
                return waiter.wait()
            finally:
                self.getters.discard(waiter)
                timeout.cancel()
        else:
            raise Empty