Skip to content

Commit eab82c8

Browse files
JelleZijlstrahauntsaninjaAlexWaygood
authored
asyncio: updates for 3.11 (#7844)
CPython changes: - python/cpython@13c10bf - python/cpython@9523c0d - python/cpython@9f04ee5 - python/cpython@d03acd7 - python/cpython@195a46d Co-authored-by: Shantanu <[email protected]> Co-authored-by: Alex Waygood <[email protected]>
1 parent ada3615 commit eab82c8

18 files changed

+461
-149
lines changed

stdlib/VERSIONS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ asyncio.runners: 3.7-
7070
asyncio.staggered: 3.8-
7171
asyncio.taskgroups: 3.11-
7272
asyncio.threads: 3.9-
73+
asyncio.timeouts: 3.11-
7374
asyncio.trsock: 3.8-
7475
asyncore: 2.7-
7576
atexit: 2.7-

stdlib/asyncio/__init__.pyi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ if sys.version_info >= (3, 9):
2424

2525
if sys.version_info >= (3, 11):
2626
from .taskgroups import *
27+
from .timeouts import *
2728

2829
if sys.platform == "win32":
2930
from .windows_events import *

stdlib/asyncio/base_events.pyi

Lines changed: 133 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import ssl
22
import sys
3-
from _typeshed import FileDescriptorLike
3+
from _typeshed import FileDescriptorLike, WriteableBuffer
44
from asyncio.events import AbstractEventLoop, AbstractServer, Handle, TimerHandle
55
from asyncio.futures import Future
66
from asyncio.protocols import BaseProtocol
@@ -29,7 +29,18 @@ _ProtocolFactory: TypeAlias = Callable[[], BaseProtocol]
2929
_SSLContext: TypeAlias = bool | None | ssl.SSLContext
3030

3131
class Server(AbstractServer):
32-
if sys.version_info >= (3, 7):
32+
if sys.version_info >= (3, 11):
33+
def __init__(
34+
self,
35+
loop: AbstractEventLoop,
36+
sockets: Iterable[socket],
37+
protocol_factory: _ProtocolFactory,
38+
ssl_context: _SSLContext,
39+
backlog: int,
40+
ssl_handshake_timeout: float | None,
41+
ssl_shutdown_timeout: float | None = ...,
42+
) -> None: ...
43+
elif sys.version_info >= (3, 7):
3344
def __init__(
3445
self,
3546
loop: AbstractEventLoop,
@@ -39,12 +50,13 @@ class Server(AbstractServer):
3950
backlog: int,
4051
ssl_handshake_timeout: float | None,
4152
) -> None: ...
53+
else:
54+
def __init__(self, loop: AbstractEventLoop, sockets: list[socket]) -> None: ...
55+
if sys.version_info >= (3, 7):
4256
def get_loop(self) -> AbstractEventLoop: ...
4357
def is_serving(self) -> bool: ...
4458
async def start_serving(self) -> None: ...
4559
async def serve_forever(self) -> None: ...
46-
else:
47-
def __init__(self, loop: AbstractEventLoop, sockets: list[socket]) -> None: ...
4860
if sys.version_info >= (3, 8):
4961
@property
5062
def sockets(self) -> tuple[socket, ...]: ...
@@ -86,7 +98,11 @@ class BaseEventLoop(AbstractEventLoop):
8698
# Future methods
8799
def create_future(self) -> Future[Any]: ...
88100
# Tasks methods
89-
if sys.version_info >= (3, 8):
101+
if sys.version_info >= (3, 11):
102+
def create_task(
103+
self, coro: Coroutine[Any, Any, _T] | Generator[Any, None, _T], *, name: object = ..., context: Context | None = ...
104+
) -> Task[_T]: ...
105+
elif sys.version_info >= (3, 8):
90106
def create_task(self, coro: Coroutine[Any, Any, _T] | Generator[Any, None, _T], *, name: object = ...) -> Task[_T]: ...
91107
else:
92108
def create_task(self, coro: Coroutine[Any, Any, _T] | Generator[Any, None, _T]) -> Task[_T]: ...
@@ -113,7 +129,46 @@ class BaseEventLoop(AbstractEventLoop):
113129
flags: int = ...,
114130
) -> list[tuple[AddressFamily, SocketKind, int, str, tuple[str, int] | tuple[str, int, int, int]]]: ...
115131
async def getnameinfo(self, sockaddr: tuple[str, int] | tuple[str, int, int, int], flags: int = ...) -> tuple[str, str]: ...
116-
if sys.version_info >= (3, 8):
132+
if sys.version_info >= (3, 11):
133+
@overload
134+
async def create_connection(
135+
self,
136+
protocol_factory: Callable[[], _ProtocolT],
137+
host: str = ...,
138+
port: int = ...,
139+
*,
140+
ssl: _SSLContext = ...,
141+
family: int = ...,
142+
proto: int = ...,
143+
flags: int = ...,
144+
sock: None = ...,
145+
local_addr: tuple[str, int] | None = ...,
146+
server_hostname: str | None = ...,
147+
ssl_handshake_timeout: float | None = ...,
148+
ssl_shutdown_timeout: float | None = ...,
149+
happy_eyeballs_delay: float | None = ...,
150+
interleave: int | None = ...,
151+
) -> tuple[BaseTransport, _ProtocolT]: ...
152+
@overload
153+
async def create_connection(
154+
self,
155+
protocol_factory: Callable[[], _ProtocolT],
156+
host: None = ...,
157+
port: None = ...,
158+
*,
159+
ssl: _SSLContext = ...,
160+
family: int = ...,
161+
proto: int = ...,
162+
flags: int = ...,
163+
sock: socket,
164+
local_addr: None = ...,
165+
server_hostname: str | None = ...,
166+
ssl_handshake_timeout: float | None = ...,
167+
ssl_shutdown_timeout: float | None = ...,
168+
happy_eyeballs_delay: float | None = ...,
169+
interleave: int | None = ...,
170+
) -> tuple[BaseTransport, _ProtocolT]: ...
171+
elif sys.version_info >= (3, 8):
117172
@overload
118173
async def create_connection(
119174
self,
@@ -214,10 +269,7 @@ class BaseEventLoop(AbstractEventLoop):
214269
local_addr: None = ...,
215270
server_hostname: str | None = ...,
216271
) -> tuple[BaseTransport, _ProtocolT]: ...
217-
if sys.version_info >= (3, 7):
218-
async def sock_sendfile(
219-
self, sock: socket, file: IO[bytes], offset: int = ..., count: int | None = ..., *, fallback: bool | None = ...
220-
) -> int: ...
272+
if sys.version_info >= (3, 11):
221273
@overload
222274
async def create_server(
223275
self,
@@ -233,6 +285,7 @@ class BaseEventLoop(AbstractEventLoop):
233285
reuse_address: bool | None = ...,
234286
reuse_port: bool | None = ...,
235287
ssl_handshake_timeout: float | None = ...,
288+
ssl_shutdown_timeout: float | None = ...,
236289
start_serving: bool = ...,
237290
) -> Server: ...
238291
@overload
@@ -250,19 +303,64 @@ class BaseEventLoop(AbstractEventLoop):
250303
reuse_address: bool | None = ...,
251304
reuse_port: bool | None = ...,
252305
ssl_handshake_timeout: float | None = ...,
306+
ssl_shutdown_timeout: float | None = ...,
253307
start_serving: bool = ...,
254308
) -> Server: ...
309+
async def start_tls(
310+
self,
311+
transport: BaseTransport,
312+
protocol: BaseProtocol,
313+
sslcontext: ssl.SSLContext,
314+
*,
315+
server_side: bool = ...,
316+
server_hostname: str | None = ...,
317+
ssl_handshake_timeout: float | None = ...,
318+
ssl_shutdown_timeout: float | None = ...,
319+
) -> BaseTransport: ...
255320
async def connect_accepted_socket(
256321
self,
257322
protocol_factory: Callable[[], _ProtocolT],
258323
sock: socket,
259324
*,
260325
ssl: _SSLContext = ...,
261326
ssl_handshake_timeout: float | None = ...,
327+
ssl_shutdown_timeout: float | None = ...,
262328
) -> tuple[BaseTransport, _ProtocolT]: ...
263-
async def sendfile(
264-
self, transport: BaseTransport, file: IO[bytes], offset: int = ..., count: int | None = ..., *, fallback: bool = ...
265-
) -> int: ...
329+
elif sys.version_info >= (3, 7):
330+
@overload
331+
async def create_server(
332+
self,
333+
protocol_factory: _ProtocolFactory,
334+
host: str | Sequence[str] | None = ...,
335+
port: int = ...,
336+
*,
337+
family: int = ...,
338+
flags: int = ...,
339+
sock: None = ...,
340+
backlog: int = ...,
341+
ssl: _SSLContext = ...,
342+
reuse_address: bool | None = ...,
343+
reuse_port: bool | None = ...,
344+
ssl_handshake_timeout: float | None = ...,
345+
start_serving: bool = ...,
346+
) -> Server: ...
347+
@overload
348+
async def create_server(
349+
self,
350+
protocol_factory: _ProtocolFactory,
351+
host: None = ...,
352+
port: None = ...,
353+
*,
354+
family: int = ...,
355+
flags: int = ...,
356+
sock: socket = ...,
357+
backlog: int = ...,
358+
ssl: _SSLContext = ...,
359+
reuse_address: bool | None = ...,
360+
reuse_port: bool | None = ...,
361+
ssl_handshake_timeout: float | None = ...,
362+
start_serving: bool = ...,
363+
) -> Server: ...
266364
async def start_tls(
267365
self,
268366
transport: BaseTransport,
@@ -273,6 +371,14 @@ class BaseEventLoop(AbstractEventLoop):
273371
server_hostname: str | None = ...,
274372
ssl_handshake_timeout: float | None = ...,
275373
) -> BaseTransport: ...
374+
async def connect_accepted_socket(
375+
self,
376+
protocol_factory: Callable[[], _ProtocolT],
377+
sock: socket,
378+
*,
379+
ssl: _SSLContext = ...,
380+
ssl_handshake_timeout: float | None = ...,
381+
) -> tuple[BaseTransport, _ProtocolT]: ...
276382
else:
277383
@overload
278384
async def create_server(
@@ -307,6 +413,13 @@ class BaseEventLoop(AbstractEventLoop):
307413
async def connect_accepted_socket(
308414
self, protocol_factory: Callable[[], _ProtocolT], sock: socket, *, ssl: _SSLContext = ...
309415
) -> tuple[BaseTransport, _ProtocolT]: ...
416+
if sys.version_info >= (3, 7):
417+
async def sock_sendfile(
418+
self, sock: socket, file: IO[bytes], offset: int = ..., count: int | None = ..., *, fallback: bool | None = ...
419+
) -> int: ...
420+
async def sendfile(
421+
self, transport: BaseTransport, file: IO[bytes], offset: int = ..., count: int | None = ..., *, fallback: bool = ...
422+
) -> int: ...
310423
if sys.version_info >= (3, 11):
311424
async def create_datagram_endpoint( # type: ignore[override]
312425
self,
@@ -378,10 +491,12 @@ class BaseEventLoop(AbstractEventLoop):
378491
def remove_reader(self, fd: FileDescriptorLike) -> bool: ...
379492
def add_writer(self, fd: FileDescriptorLike, callback: Callable[..., Any], *args: Any) -> None: ...
380493
def remove_writer(self, fd: FileDescriptorLike) -> bool: ...
494+
# The sock_* methods (and probably some others) are not actually implemented on
495+
# BaseEventLoop, only on subclasses. We list them here for now for convenience.
381496
# Completion based I/O methods returning Futures prior to 3.7
382497
if sys.version_info >= (3, 7):
383498
async def sock_recv(self, sock: socket, nbytes: int) -> bytes: ...
384-
async def sock_recv_into(self, sock: socket, buf: bytearray) -> int: ...
499+
async def sock_recv_into(self, sock: socket, buf: WriteableBuffer) -> int: ...
385500
async def sock_sendall(self, sock: socket, data: bytes) -> None: ...
386501
async def sock_connect(self, sock: socket, address: _Address) -> None: ...
387502
async def sock_accept(self, sock: socket) -> tuple[socket, _RetAddress]: ...
@@ -390,6 +505,10 @@ class BaseEventLoop(AbstractEventLoop):
390505
def sock_sendall(self, sock: socket, data: bytes) -> Future[None]: ...
391506
def sock_connect(self, sock: socket, address: _Address) -> Future[None]: ...
392507
def sock_accept(self, sock: socket) -> Future[tuple[socket, _RetAddress]]: ...
508+
if sys.version_info >= (3, 11):
509+
async def sock_recvfrom(self, sock: socket, bufsize: int) -> bytes: ...
510+
async def sock_recvfrom_into(self, sock: socket, buf: WriteableBuffer, nbytes: int = ...) -> int: ...
511+
async def sock_sendto(self, sock: socket, data: bytes, address: _Address) -> None: ...
393512
# Signal handling.
394513
def add_signal_handler(self, sig: int, callback: Callable[..., Any], *args: Any) -> None: ...
395514
def remove_signal_handler(self, sig: int) -> bool: ...

stdlib/asyncio/constants.pyi

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ DEBUG_STACK_DEPTH: Literal[10]
88
if sys.version_info >= (3, 7):
99
SSL_HANDSHAKE_TIMEOUT: float
1010
SENDFILE_FALLBACK_READBUFFER_SIZE: Literal[262144]
11+
if sys.version_info >= (3, 11):
12+
SSL_SHUTDOWN_TIMEOUT: float
13+
FLOW_CONTROL_HIGH_WATER_SSL_READ: Literal[256]
14+
FLOW_CONTROL_HIGH_WATER_SSL_WRITE: Literal[512]
1115

1216
class _SendfileMode(enum.Enum):
1317
UNSUPPORTED: int

0 commit comments

Comments
 (0)