Skip to content

Commit a044da1

Browse files
authored
Merge pull request #34 from jepler/improve-await-never
Rework how the never singleton is invoked
2 parents 0c36d81 + 378b4fb commit a044da1

File tree

3 files changed

+10
-11
lines changed

3 files changed

+10
-11
lines changed

asyncio/core.py

+8-7
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,11 @@ def sleep(t):
9494

9595
################################################################################
9696
# "Never schedule" object"
97-
# Don't re-schedule the object that awaits the _never singleton.
97+
# Don't re-schedule the object that awaits _never().
9898
# For internal use only. Some constructs, like `await event.wait()`,
9999
# work by NOT re-scheduling the task which calls wait(), but by
100100
# having some other task schedule it later.
101-
class _Never:
101+
class _NeverSingletonGenerator:
102102
def __init__(self):
103103
self.state = None
104104
self.exc = StopIteration()
@@ -117,7 +117,10 @@ def __next__(self):
117117
self.exc.__traceback__ = None
118118
raise self.exc
119119

120-
_never = _Never()
120+
def _never(sgen=_NeverSingletonGenerator()):
121+
# assert sgen.state is None, "Check for a missing `await` in your code"
122+
sgen.state = False
123+
return sgen
121124

122125

123126
################################################################################
@@ -150,13 +153,11 @@ def _dequeue(self, s):
150153

151154
async def queue_read(self, s):
152155
self._enqueue(s, 0)
153-
_never.state = False
154-
await _never
156+
await _never()
155157

156158
async def queue_write(self, s):
157159
self._enqueue(s, 1)
158-
_never.state = False
159-
await _never
160+
await _never()
160161

161162
def remove(self, task):
162163
while True:

asyncio/event.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,7 @@ async def wait(self):
6262
self.waiting.push_head(core.cur_task)
6363
# Set calling task's data to the event's queue so it can be removed if needed
6464
core.cur_task.data = self.waiting
65-
core._never.state = False
66-
await core._never
65+
await core._never()
6766
return True
6867

6968

asyncio/lock.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,7 @@ async def acquire(self):
6969
# Set calling task's data to the lock's queue so it can be removed if needed
7070
core.cur_task.data = self.waiting
7171
try:
72-
core._never.state = False
73-
await core._never
72+
await core._never()
7473
except core.CancelledError as er:
7574
if self.state == core.cur_task:
7675
# Cancelled while pending on resume, schedule next waiting Task

0 commit comments

Comments
 (0)