mirror of
https://github.com/python/cpython.git
synced 2025-08-28 12:45:07 +00:00
Fix asyncio issue 235 (merge from 3.4).
This commit is contained in:
commit
f75d4a7ad0
3 changed files with 36 additions and 11 deletions
|
@ -53,6 +53,8 @@ class Queue:
|
|||
self._finished.set()
|
||||
self._init(maxsize)
|
||||
|
||||
# These three are overridable in subclasses.
|
||||
|
||||
def _init(self, maxsize):
|
||||
self._queue = collections.deque()
|
||||
|
||||
|
@ -61,6 +63,11 @@ class Queue:
|
|||
|
||||
def _put(self, item):
|
||||
self._queue.append(item)
|
||||
|
||||
# End of the overridable methods.
|
||||
|
||||
def __put_internal(self, item):
|
||||
self._put(item)
|
||||
self._unfinished_tasks += 1
|
||||
self._finished.clear()
|
||||
|
||||
|
@ -132,7 +139,7 @@ class Queue:
|
|||
'queue non-empty, why are getters waiting?')
|
||||
|
||||
getter = self._getters.popleft()
|
||||
self._put(item)
|
||||
self.__put_internal(item)
|
||||
|
||||
# getter cannot be cancelled, we just removed done getters
|
||||
getter.set_result(self._get())
|
||||
|
@ -144,7 +151,7 @@ class Queue:
|
|||
yield from waiter
|
||||
|
||||
else:
|
||||
self._put(item)
|
||||
self.__put_internal(item)
|
||||
|
||||
def put_nowait(self, item):
|
||||
"""Put an item into the queue without blocking.
|
||||
|
@ -157,7 +164,7 @@ class Queue:
|
|||
'queue non-empty, why are getters waiting?')
|
||||
|
||||
getter = self._getters.popleft()
|
||||
self._put(item)
|
||||
self.__put_internal(item)
|
||||
|
||||
# getter cannot be cancelled, we just removed done getters
|
||||
getter.set_result(self._get())
|
||||
|
@ -165,7 +172,7 @@ class Queue:
|
|||
elif self._maxsize > 0 and self._maxsize <= self.qsize():
|
||||
raise QueueFull
|
||||
else:
|
||||
self._put(item)
|
||||
self.__put_internal(item)
|
||||
|
||||
@coroutine
|
||||
def get(self):
|
||||
|
@ -179,7 +186,7 @@ class Queue:
|
|||
if self._putters:
|
||||
assert self.full(), 'queue not full, why are putters waiting?'
|
||||
item, putter = self._putters.popleft()
|
||||
self._put(item)
|
||||
self.__put_internal(item)
|
||||
|
||||
# When a getter runs and frees up a slot so this putter can
|
||||
# run, we need to defer the put for a tick to ensure that
|
||||
|
@ -206,7 +213,7 @@ class Queue:
|
|||
if self._putters:
|
||||
assert self.full(), 'queue not full, why are putters waiting?'
|
||||
item, putter = self._putters.popleft()
|
||||
self._put(item)
|
||||
self.__put_internal(item)
|
||||
# Wake putter on next tick.
|
||||
|
||||
# getter cannot be cancelled, we just removed done putters
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue