Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 3531d90

Browse files
committed
asyncio: sync with Tulip
* Document why set_result() calls are safe * Cleanup gather(). Use public methods instead of hacks to consume the exception of a future. * sock_connect(): pass directly the fd to _sock_connect_done instead of the socket.
1 parent 399c59d commit 3531d90

3 files changed

Lines changed: 16 additions & 7 deletions

File tree

Lib/asyncio/queues.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ def put(self, item):
126126
# Use _put and _get instead of passing item straight to getter, in
127127
# case a subclass has logic that must run (e.g. JoinableQueue).
128128
self._put(item)
129+
130+
# getter cannot be cancelled, we just removed done getters
129131
getter.set_result(self._get())
130132

131133
elif self._maxsize > 0 and self._maxsize <= self.qsize():
@@ -152,6 +154,8 @@ def put_nowait(self, item):
152154
# Use _put and _get instead of passing item straight to getter, in
153155
# case a subclass has logic that must run (e.g. JoinableQueue).
154156
self._put(item)
157+
158+
# getter cannot be cancelled, we just removed done getters
155159
getter.set_result(self._get())
156160

157161
elif self._maxsize > 0 and self._maxsize <= self.qsize():
@@ -200,6 +204,8 @@ def get_nowait(self):
200204
item, putter = self._putters.popleft()
201205
self._put(item)
202206
# Wake putter on next tick.
207+
208+
# getter cannot be cancelled, we just removed done putters
203209
putter.set_result(None)
204210

205211
return self._get()

Lib/asyncio/selector_events.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -363,15 +363,15 @@ def _sock_connect(self, fut, sock, address):
363363
break
364364
except BlockingIOError:
365365
fut.add_done_callback(functools.partial(self._sock_connect_done,
366-
sock))
366+
fd))
367367
self.add_writer(fd, self._sock_connect_cb, fut, sock, address)
368368
except Exception as exc:
369369
fut.set_exception(exc)
370370
else:
371371
fut.set_result(None)
372372

373-
def _sock_connect_done(self, sock, fut):
374-
self.remove_writer(sock.fileno())
373+
def _sock_connect_done(self, fd, fut):
374+
self.remove_writer(fd)
375375

376376
def _sock_connect_cb(self, fut, sock, address):
377377
if fut.cancelled():

Lib/asyncio/tasks.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -582,11 +582,12 @@ def gather(*coros_or_futures, loop=None, return_exceptions=False):
582582

583583
def _done_callback(i, fut):
584584
nonlocal nfinished
585-
if outer._state != futures._PENDING:
586-
if fut._exception is not None:
585+
if outer.done():
586+
if not fut.cancelled():
587587
# Mark exception retrieved.
588588
fut.exception()
589589
return
590+
590591
if fut._state == futures._CANCELLED:
591592
res = futures.CancelledError()
592593
if not return_exceptions:
@@ -644,9 +645,11 @@ def shield(arg, *, loop=None):
644645

645646
def _done_callback(inner):
646647
if outer.cancelled():
647-
# Mark inner's result as retrieved.
648-
inner.cancelled() or inner.exception()
648+
if not inner.cancelled():
649+
# Mark inner's result as retrieved.
650+
inner.exception()
649651
return
652+
650653
if inner.cancelled():
651654
outer.cancel()
652655
else:

0 commit comments

Comments
 (0)