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

Skip to content

Commit 7661db6

Browse files
committed
Issue #27041: asyncio: Add loop.create_future method
1 parent 7ed7ce6 commit 7661db6

14 files changed

Lines changed: 55 additions & 39 deletions

Lib/asyncio/base_events.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ def _wakeup(self):
209209
def wait_closed(self):
210210
if self.sockets is None or self._waiters is None:
211211
return
212-
waiter = futures.Future(loop=self._loop)
212+
waiter = self._loop.create_future()
213213
self._waiters.append(waiter)
214214
yield from waiter
215215

@@ -243,6 +243,10 @@ def __repr__(self):
243243
% (self.__class__.__name__, self.is_running(),
244244
self.is_closed(), self.get_debug()))
245245

246+
def create_future(self):
247+
"""Create a Future object attached to the loop."""
248+
return futures.Future(loop=self)
249+
246250
def create_task(self, coro):
247251
"""Schedule a coroutine object.
248252
@@ -536,7 +540,7 @@ def run_in_executor(self, executor, func, *args):
536540
assert not args
537541
assert not isinstance(func, events.TimerHandle)
538542
if func._cancelled:
539-
f = futures.Future(loop=self)
543+
f = self.create_future()
540544
f.set_result(None)
541545
return f
542546
func, args = func._callback, func._args
@@ -579,7 +583,7 @@ def getaddrinfo(self, host, port, *,
579583
family=0, type=0, proto=0, flags=0):
580584
info = _ipaddr_info(host, port, family, type, proto)
581585
if info is not None:
582-
fut = futures.Future(loop=self)
586+
fut = self.create_future()
583587
fut.set_result([info])
584588
return fut
585589
elif self._debug:
@@ -720,7 +724,7 @@ def create_connection(self, protocol_factory, host=None, port=None, *,
720724
def _create_connection_transport(self, sock, protocol_factory, ssl,
721725
server_hostname):
722726
protocol = protocol_factory()
723-
waiter = futures.Future(loop=self)
727+
waiter = self.create_future()
724728
if ssl:
725729
sslcontext = None if isinstance(ssl, bool) else ssl
726730
transport = self._make_ssl_transport(
@@ -840,7 +844,7 @@ def create_datagram_endpoint(self, protocol_factory,
840844
raise exceptions[0]
841845

842846
protocol = protocol_factory()
843-
waiter = futures.Future(loop=self)
847+
waiter = self.create_future()
844848
transport = self._make_datagram_transport(
845849
sock, protocol, r_addr, waiter)
846850
if self._debug:
@@ -979,7 +983,7 @@ def create_server(self, protocol_factory, host=None, port=None,
979983
@coroutine
980984
def connect_read_pipe(self, protocol_factory, pipe):
981985
protocol = protocol_factory()
982-
waiter = futures.Future(loop=self)
986+
waiter = self.create_future()
983987
transport = self._make_read_pipe_transport(pipe, protocol, waiter)
984988

985989
try:
@@ -996,7 +1000,7 @@ def connect_read_pipe(self, protocol_factory, pipe):
9961000
@coroutine
9971001
def connect_write_pipe(self, protocol_factory, pipe):
9981002
protocol = protocol_factory()
999-
waiter = futures.Future(loop=self)
1003+
waiter = self.create_future()
10001004
transport = self._make_write_pipe_transport(pipe, protocol, waiter)
10011005

10021006
try:

Lib/asyncio/base_subprocess.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ def _wait(self):
227227
if self._returncode is not None:
228228
return self._returncode
229229

230-
waiter = futures.Future(loop=self._loop)
230+
waiter = self._loop.create_future()
231231
self._exit_waiters.append(waiter)
232232
return (yield from waiter)
233233

Lib/asyncio/events.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,9 @@ def call_at(self, when, callback, *args):
266266
def time(self):
267267
raise NotImplementedError
268268

269+
def create_future(self):
270+
raise NotImplementedError
271+
269272
# Method scheduling a coroutine object: create a task.
270273

271274
def create_task(self, coro):

Lib/asyncio/futures.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,8 @@ def wrap_future(future, *, loop=None):
451451
return future
452452
assert isinstance(future, concurrent.futures.Future), \
453453
'concurrent.futures.Future is expected, got {!r}'.format(future)
454-
new_future = Future(loop=loop)
454+
if loop is None:
455+
loop = events.get_event_loop()
456+
new_future = loop.create_future()
455457
_chain_future(future, new_future)
456458
return new_future

Lib/asyncio/locks.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ def acquire(self):
170170
self._locked = True
171171
return True
172172

173-
fut = futures.Future(loop=self._loop)
173+
fut = self._loop.create_future()
174174
self._waiters.append(fut)
175175
try:
176176
yield from fut
@@ -258,7 +258,7 @@ def wait(self):
258258
if self._value:
259259
return True
260260

261-
fut = futures.Future(loop=self._loop)
261+
fut = self._loop.create_future()
262262
self._waiters.append(fut)
263263
try:
264264
yield from fut
@@ -320,7 +320,7 @@ def wait(self):
320320

321321
self.release()
322322
try:
323-
fut = futures.Future(loop=self._loop)
323+
fut = self._loop.create_future()
324324
self._waiters.append(fut)
325325
try:
326326
yield from fut
@@ -433,7 +433,7 @@ def acquire(self):
433433
True.
434434
"""
435435
while self._value <= 0:
436-
fut = futures.Future(loop=self._loop)
436+
fut = self._loop.create_future()
437437
self._waiters.append(fut)
438438
try:
439439
yield from fut

Lib/asyncio/proactor_events.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,7 @@ def sock_connect(self, sock, address):
443443
try:
444444
base_events._check_resolved_address(sock, address)
445445
except ValueError as err:
446-
fut = futures.Future(loop=self)
446+
fut = self.create_future()
447447
fut.set_exception(err)
448448
return fut
449449
else:

Lib/asyncio/queues.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ def put(self, item):
128128
This method is a coroutine.
129129
"""
130130
while self.full():
131-
putter = futures.Future(loop=self._loop)
131+
putter = self._loop.create_future()
132132
self._putters.append(putter)
133133
try:
134134
yield from putter
@@ -162,7 +162,7 @@ def get(self):
162162
This method is a coroutine.
163163
"""
164164
while self.empty():
165-
getter = futures.Future(loop=self._loop)
165+
getter = self._loop.create_future()
166166
self._getters.append(getter)
167167
try:
168168
yield from getter

Lib/asyncio/selector_events.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ def _accept_connection2(self, protocol_factory, conn, extra,
196196
transport = None
197197
try:
198198
protocol = protocol_factory()
199-
waiter = futures.Future(loop=self)
199+
waiter = self.create_future()
200200
if sslcontext:
201201
transport = self._make_ssl_transport(
202202
conn, protocol, sslcontext, waiter=waiter,
@@ -314,7 +314,7 @@ def sock_recv(self, sock, n):
314314
"""
315315
if self._debug and sock.gettimeout() != 0:
316316
raise ValueError("the socket must be non-blocking")
317-
fut = futures.Future(loop=self)
317+
fut = self.create_future()
318318
self._sock_recv(fut, False, sock, n)
319319
return fut
320320

@@ -352,7 +352,7 @@ def sock_sendall(self, sock, data):
352352
"""
353353
if self._debug and sock.gettimeout() != 0:
354354
raise ValueError("the socket must be non-blocking")
355-
fut = futures.Future(loop=self)
355+
fut = self.create_future()
356356
if data:
357357
self._sock_sendall(fut, False, sock, data)
358358
else:
@@ -395,7 +395,7 @@ def sock_connect(self, sock, address):
395395
"""
396396
if self._debug and sock.gettimeout() != 0:
397397
raise ValueError("the socket must be non-blocking")
398-
fut = futures.Future(loop=self)
398+
fut = self.create_future()
399399
try:
400400
base_events._check_resolved_address(sock, address)
401401
except ValueError as err:
@@ -453,7 +453,7 @@ def sock_accept(self, sock):
453453
"""
454454
if self._debug and sock.gettimeout() != 0:
455455
raise ValueError("the socket must be non-blocking")
456-
fut = futures.Future(loop=self)
456+
fut = self.create_future()
457457
self._sock_accept(fut, False, sock)
458458
return fut
459459

Lib/asyncio/streams.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ def _drain_helper(self):
210210
return
211211
waiter = self._drain_waiter
212212
assert waiter is None or waiter.cancelled()
213-
waiter = futures.Future(loop=self._loop)
213+
waiter = self._loop.create_future()
214214
self._drain_waiter = waiter
215215
yield from waiter
216216

@@ -449,7 +449,7 @@ def _wait_for_data(self, func_name):
449449
self._paused = False
450450
self._transport.resume_reading()
451451

452-
self._waiter = futures.Future(loop=self._loop)
452+
self._waiter = self._loop.create_future()
453453
try:
454454
yield from self._waiter
455455
finally:

Lib/asyncio/tasks.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ def wait_for(fut, timeout, *, loop=None):
373373
if timeout is None:
374374
return (yield from fut)
375375

376-
waiter = futures.Future(loop=loop)
376+
waiter = loop.create_future()
377377
timeout_handle = loop.call_later(timeout, _release_waiter, waiter)
378378
cb = functools.partial(_release_waiter, waiter)
379379

@@ -406,7 +406,7 @@ def _wait(fs, timeout, return_when, loop):
406406
The fs argument must be a collection of Futures.
407407
"""
408408
assert fs, 'Set of Futures is empty.'
409-
waiter = futures.Future(loop=loop)
409+
waiter = loop.create_future()
410410
timeout_handle = None
411411
if timeout is not None:
412412
timeout_handle = loop.call_later(timeout, _release_waiter, waiter)
@@ -507,7 +507,9 @@ def sleep(delay, result=None, *, loop=None):
507507
yield
508508
return result
509509

510-
future = futures.Future(loop=loop)
510+
if loop is None:
511+
loop = events.get_event_loop()
512+
future = loop.create_future()
511513
h = future._loop.call_later(delay,
512514
futures._set_result_unless_cancelled,
513515
future, result)
@@ -604,7 +606,9 @@ def gather(*coros_or_futures, loop=None, return_exceptions=False):
604606
be cancelled.)
605607
"""
606608
if not coros_or_futures:
607-
outer = futures.Future(loop=loop)
609+
if loop is None:
610+
loop = events.get_event_loop()
611+
outer = loop.create_future()
608612
outer.set_result([])
609613
return outer
610614

@@ -692,7 +696,7 @@ def shield(arg, *, loop=None):
692696
# Shortcut.
693697
return inner
694698
loop = inner._loop
695-
outer = futures.Future(loop=loop)
699+
outer = loop.create_future()
696700

697701
def _done_callback(inner):
698702
if outer.cancelled():

0 commit comments

Comments
 (0)