mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	gh-121423: Improve import time of socket (#121424)
				
					
				
			Improve import time of `socket` by writing `socket.errorTab` as a constant and lazy import modules. Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> Co-authored-by: Gregory P. Smith <greg@krypto.org> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Co-authored-by: Shantanu <12621235+hauntsaninja@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									91ff700de2
								
							
						
					
					
						commit
						7bd964dbbe
					
				
					 2 changed files with 109 additions and 101 deletions
				
			
		
							
								
								
									
										208
									
								
								Lib/socket.py
									
										
									
									
									
								
							
							
						
						
									
										208
									
								
								Lib/socket.py
									
										
									
									
									
								
							|  | @ -52,7 +52,9 @@ | |||
| import _socket | ||||
| from _socket import * | ||||
| 
 | ||||
| import os, sys, io, selectors | ||||
| import io | ||||
| import os | ||||
| import sys | ||||
| from enum import IntEnum, IntFlag | ||||
| 
 | ||||
| try: | ||||
|  | @ -110,102 +112,103 @@ def _intenum_converter(value, enum_klass): | |||
| 
 | ||||
| # WSA error codes | ||||
| if sys.platform.lower().startswith("win"): | ||||
|     errorTab = {} | ||||
|     errorTab[6] = "Specified event object handle is invalid." | ||||
|     errorTab[8] = "Insufficient memory available." | ||||
|     errorTab[87] = "One or more parameters are invalid." | ||||
|     errorTab[995] = "Overlapped operation aborted." | ||||
|     errorTab[996] = "Overlapped I/O event object not in signaled state." | ||||
|     errorTab[997] = "Overlapped operation will complete later." | ||||
|     errorTab[10004] = "The operation was interrupted." | ||||
|     errorTab[10009] = "A bad file handle was passed." | ||||
|     errorTab[10013] = "Permission denied." | ||||
|     errorTab[10014] = "A fault occurred on the network??"  # WSAEFAULT | ||||
|     errorTab[10022] = "An invalid operation was attempted." | ||||
|     errorTab[10024] = "Too many open files." | ||||
|     errorTab[10035] = "The socket operation would block." | ||||
|     errorTab[10036] = "A blocking operation is already in progress." | ||||
|     errorTab[10037] = "Operation already in progress." | ||||
|     errorTab[10038] = "Socket operation on nonsocket." | ||||
|     errorTab[10039] = "Destination address required." | ||||
|     errorTab[10040] = "Message too long." | ||||
|     errorTab[10041] = "Protocol wrong type for socket." | ||||
|     errorTab[10042] = "Bad protocol option." | ||||
|     errorTab[10043] = "Protocol not supported." | ||||
|     errorTab[10044] = "Socket type not supported." | ||||
|     errorTab[10045] = "Operation not supported." | ||||
|     errorTab[10046] = "Protocol family not supported." | ||||
|     errorTab[10047] = "Address family not supported by protocol family." | ||||
|     errorTab[10048] = "The network address is in use." | ||||
|     errorTab[10049] = "Cannot assign requested address." | ||||
|     errorTab[10050] = "Network is down." | ||||
|     errorTab[10051] = "Network is unreachable." | ||||
|     errorTab[10052] = "Network dropped connection on reset." | ||||
|     errorTab[10053] = "Software caused connection abort." | ||||
|     errorTab[10054] = "The connection has been reset." | ||||
|     errorTab[10055] = "No buffer space available." | ||||
|     errorTab[10056] = "Socket is already connected." | ||||
|     errorTab[10057] = "Socket is not connected." | ||||
|     errorTab[10058] = "The network has been shut down." | ||||
|     errorTab[10059] = "Too many references." | ||||
|     errorTab[10060] = "The operation timed out." | ||||
|     errorTab[10061] = "Connection refused." | ||||
|     errorTab[10062] = "Cannot translate name." | ||||
|     errorTab[10063] = "The name is too long." | ||||
|     errorTab[10064] = "The host is down." | ||||
|     errorTab[10065] = "The host is unreachable." | ||||
|     errorTab[10066] = "Directory not empty." | ||||
|     errorTab[10067] = "Too many processes." | ||||
|     errorTab[10068] = "User quota exceeded." | ||||
|     errorTab[10069] = "Disk quota exceeded." | ||||
|     errorTab[10070] = "Stale file handle reference." | ||||
|     errorTab[10071] = "Item is remote." | ||||
|     errorTab[10091] = "Network subsystem is unavailable." | ||||
|     errorTab[10092] = "Winsock.dll version out of range." | ||||
|     errorTab[10093] = "Successful WSAStartup not yet performed." | ||||
|     errorTab[10101] = "Graceful shutdown in progress." | ||||
|     errorTab[10102] = "No more results from WSALookupServiceNext." | ||||
|     errorTab[10103] = "Call has been canceled." | ||||
|     errorTab[10104] = "Procedure call table is invalid." | ||||
|     errorTab[10105] = "Service provider is invalid." | ||||
|     errorTab[10106] = "Service provider failed to initialize." | ||||
|     errorTab[10107] = "System call failure." | ||||
|     errorTab[10108] = "Service not found." | ||||
|     errorTab[10109] = "Class type not found." | ||||
|     errorTab[10110] = "No more results from WSALookupServiceNext." | ||||
|     errorTab[10111] = "Call was canceled." | ||||
|     errorTab[10112] = "Database query was refused." | ||||
|     errorTab[11001] = "Host not found." | ||||
|     errorTab[11002] = "Nonauthoritative host not found." | ||||
|     errorTab[11003] = "This is a nonrecoverable error." | ||||
|     errorTab[11004] = "Valid name, no data record requested type." | ||||
|     errorTab[11005] = "QoS receivers." | ||||
|     errorTab[11006] = "QoS senders." | ||||
|     errorTab[11007] = "No QoS senders." | ||||
|     errorTab[11008] = "QoS no receivers." | ||||
|     errorTab[11009] = "QoS request confirmed." | ||||
|     errorTab[11010] = "QoS admission error." | ||||
|     errorTab[11011] = "QoS policy failure." | ||||
|     errorTab[11012] = "QoS bad style." | ||||
|     errorTab[11013] = "QoS bad object." | ||||
|     errorTab[11014] = "QoS traffic control error." | ||||
|     errorTab[11015] = "QoS generic error." | ||||
|     errorTab[11016] = "QoS service type error." | ||||
|     errorTab[11017] = "QoS flowspec error." | ||||
|     errorTab[11018] = "Invalid QoS provider buffer." | ||||
|     errorTab[11019] = "Invalid QoS filter style." | ||||
|     errorTab[11020] = "Invalid QoS filter style." | ||||
|     errorTab[11021] = "Incorrect QoS filter count." | ||||
|     errorTab[11022] = "Invalid QoS object length." | ||||
|     errorTab[11023] = "Incorrect QoS flow count." | ||||
|     errorTab[11024] = "Unrecognized QoS object." | ||||
|     errorTab[11025] = "Invalid QoS policy object." | ||||
|     errorTab[11026] = "Invalid QoS flow descriptor." | ||||
|     errorTab[11027] = "Invalid QoS provider-specific flowspec." | ||||
|     errorTab[11028] = "Invalid QoS provider-specific filterspec." | ||||
|     errorTab[11029] = "Invalid QoS shape discard mode object." | ||||
|     errorTab[11030] = "Invalid QoS shaping rate object." | ||||
|     errorTab[11031] = "Reserved policy QoS element type." | ||||
|     errorTab = { | ||||
|         6: "Specified event object handle is invalid.", | ||||
|         8: "Insufficient memory available.", | ||||
|         87: "One or more parameters are invalid.", | ||||
|         995: "Overlapped operation aborted.", | ||||
|         996: "Overlapped I/O event object not in signaled state.", | ||||
|         997: "Overlapped operation will complete later.", | ||||
|         10004: "The operation was interrupted.", | ||||
|         10009: "A bad file handle was passed.", | ||||
|         10013: "Permission denied.", | ||||
|         10014: "A fault occurred on the network??", | ||||
|         10022: "An invalid operation was attempted.", | ||||
|         10024: "Too many open files.", | ||||
|         10035: "The socket operation would block.", | ||||
|         10036: "A blocking operation is already in progress.", | ||||
|         10037: "Operation already in progress.", | ||||
|         10038: "Socket operation on nonsocket.", | ||||
|         10039: "Destination address required.", | ||||
|         10040: "Message too long.", | ||||
|         10041: "Protocol wrong type for socket.", | ||||
|         10042: "Bad protocol option.", | ||||
|         10043: "Protocol not supported.", | ||||
|         10044: "Socket type not supported.", | ||||
|         10045: "Operation not supported.", | ||||
|         10046: "Protocol family not supported.", | ||||
|         10047: "Address family not supported by protocol family.", | ||||
|         10048: "The network address is in use.", | ||||
|         10049: "Cannot assign requested address.", | ||||
|         10050: "Network is down.", | ||||
|         10051: "Network is unreachable.", | ||||
|         10052: "Network dropped connection on reset.", | ||||
|         10053: "Software caused connection abort.", | ||||
|         10054: "The connection has been reset.", | ||||
|         10055: "No buffer space available.", | ||||
|         10056: "Socket is already connected.", | ||||
|         10057: "Socket is not connected.", | ||||
|         10058: "The network has been shut down.", | ||||
|         10059: "Too many references.", | ||||
|         10060: "The operation timed out.", | ||||
|         10061: "Connection refused.", | ||||
|         10062: "Cannot translate name.", | ||||
|         10063: "The name is too long.", | ||||
|         10064: "The host is down.", | ||||
|         10065: "The host is unreachable.", | ||||
|         10066: "Directory not empty.", | ||||
|         10067: "Too many processes.", | ||||
|         10068: "User quota exceeded.", | ||||
|         10069: "Disk quota exceeded.", | ||||
|         10070: "Stale file handle reference.", | ||||
|         10071: "Item is remote.", | ||||
|         10091: "Network subsystem is unavailable.", | ||||
|         10092: "Winsock.dll version out of range.", | ||||
|         10093: "Successful WSAStartup not yet performed.", | ||||
|         10101: "Graceful shutdown in progress.", | ||||
|         10102: "No more results from WSALookupServiceNext.", | ||||
|         10103: "Call has been canceled.", | ||||
|         10104: "Procedure call table is invalid.", | ||||
|         10105: "Service provider is invalid.", | ||||
|         10106: "Service provider failed to initialize.", | ||||
|         10107: "System call failure.", | ||||
|         10108: "Service not found.", | ||||
|         10109: "Class type not found.", | ||||
|         10110: "No more results from WSALookupServiceNext.", | ||||
|         10111: "Call was canceled.", | ||||
|         10112: "Database query was refused.", | ||||
|         11001: "Host not found.", | ||||
|         11002: "Nonauthoritative host not found.", | ||||
|         11003: "This is a nonrecoverable error.", | ||||
|         11004: "Valid name, no data record requested type.", | ||||
|         11005: "QoS receivers.", | ||||
|         11006: "QoS senders.", | ||||
|         11007: "No QoS senders.", | ||||
|         11008: "QoS no receivers.", | ||||
|         11009: "QoS request confirmed.", | ||||
|         11010: "QoS admission error.", | ||||
|         11011: "QoS policy failure.", | ||||
|         11012: "QoS bad style.", | ||||
|         11013: "QoS bad object.", | ||||
|         11014: "QoS traffic control error.", | ||||
|         11015: "QoS generic error.", | ||||
|         11016: "QoS service type error.", | ||||
|         11017: "QoS flowspec error.", | ||||
|         11018: "Invalid QoS provider buffer.", | ||||
|         11019: "Invalid QoS filter style.", | ||||
|         11020: "Invalid QoS filter style.", | ||||
|         11021: "Incorrect QoS filter count.", | ||||
|         11022: "Invalid QoS object length.", | ||||
|         11023: "Incorrect QoS flow count.", | ||||
|         11024: "Unrecognized QoS object.", | ||||
|         11025: "Invalid QoS policy object.", | ||||
|         11026: "Invalid QoS flow descriptor.", | ||||
|         11027: "Invalid QoS provider-specific flowspec.", | ||||
|         11028: "Invalid QoS provider-specific filterspec.", | ||||
|         11029: "Invalid QoS shape discard mode object.", | ||||
|         11030: "Invalid QoS shaping rate object.", | ||||
|         11031: "Reserved policy QoS element type." | ||||
|     } | ||||
|     __all__.append("errorTab") | ||||
| 
 | ||||
| 
 | ||||
|  | @ -348,6 +351,9 @@ def makefile(self, mode="r", buffering=None, *, | |||
|     if hasattr(os, 'sendfile'): | ||||
| 
 | ||||
|         def _sendfile_use_sendfile(self, file, offset=0, count=None): | ||||
|             # Lazy import to improve module import time | ||||
|             import selectors | ||||
| 
 | ||||
|             self._check_sendfile_params(file, offset, count) | ||||
|             sockno = self.fileno() | ||||
|             try: | ||||
|  | @ -549,20 +555,18 @@ def fromfd(fd, family, type, proto=0): | |||
|     return socket(family, type, proto, nfd) | ||||
| 
 | ||||
| if hasattr(_socket.socket, "sendmsg"): | ||||
|     import array | ||||
| 
 | ||||
|     def send_fds(sock, buffers, fds, flags=0, address=None): | ||||
|         """ send_fds(sock, buffers, fds[, flags[, address]]) -> integer | ||||
| 
 | ||||
|         Send the list of file descriptors fds over an AF_UNIX socket. | ||||
|         """ | ||||
|         import array | ||||
| 
 | ||||
|         return sock.sendmsg(buffers, [(_socket.SOL_SOCKET, | ||||
|             _socket.SCM_RIGHTS, array.array("i", fds))]) | ||||
|     __all__.append("send_fds") | ||||
| 
 | ||||
| if hasattr(_socket.socket, "recvmsg"): | ||||
|     import array | ||||
| 
 | ||||
|     def recv_fds(sock, bufsize, maxfds, flags=0): | ||||
|         """ recv_fds(sock, bufsize, maxfds[, flags]) -> (data, list of file | ||||
|         descriptors, msg_flags, address) | ||||
|  | @ -570,6 +574,8 @@ def recv_fds(sock, bufsize, maxfds, flags=0): | |||
|         Receive up to maxfds file descriptors returning the message | ||||
|         data and a list containing the descriptors. | ||||
|         """ | ||||
|         import array | ||||
| 
 | ||||
|         # Array of ints | ||||
|         fds = array.array("i") | ||||
|         msg, ancdata, flags, addr = sock.recvmsg(bufsize, | ||||
|  |  | |||
|  | @ -0,0 +1,2 @@ | |||
| Improve import time of :mod:`socket` by lazy importing modules and | ||||
| writing :data:`!socket.errorTab` as a constant. | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Wulian
						Wulian