New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add a new optional timeout parameter to socket.socket() constructor #64012
Comments
Since Linux 2.6.28, socket() syscall accepts a new SOCK_NONBLOCK flag in the socket type. It avoids 1 or 2 extra syscalls to set the socket in non-blocking mode. This flag comes also slowly in other operating systems: NetBSD, FreeBSD, etc. FreeBSD: Discussion in the POSIX standard: Avoiding the syscalls has been proposed on python-dev a few months ago: I tried to include SOCK_NONBLOCK in my PEP-446, but I have been asked to treat it separatly because it's completly different than O_CLOEXEC (even it looks similar). I also proposed to add 2 functions in the PEP:
I propose to add a new timeout parameter to socket.socket() constructor which would set the timeout internal attribute and set O_NONBLOCK flag using the new SOCK_NONBLOCK flag, ioctl() or fcntl() (depending on the OS and on what is available). I don't know if something special should be done on Windows for non-blocking sockets? socket.socket.setblocking() already exists and I suppose that it works on Windows :-) See also the discussion in my old PEP for non-blocking operations in files on Windows: I don't know if the new parameter can just be added at the end of the parameter list, or it should be a keyword-only parameter to avoid breakpoint backward compatibility? socket.socketpair() and socket.socket.dup() and socket.fromfd(), socket.create_connection() (and more generally any function creating a new socket) may also be modified. -- By the way, internal_setblocking() currently uses 2 fcntl() syscalls on Linux, whereas it could be implemented with a single ioctl() syscall using FIONBIO. Set O_NONBLOCK flag: int flag = 1;
ioctl(fd, FIONBIO, &flag); Clear O_NONBLOCK flag: int flag = 0;
ioctl(fd, FIONBIO, &flag); Tell me if you prefer a different issue for this optimization. |
Note: Python supports socket.SOCK_NONBLOCK since Python 3.2 (issue bpo-7523). |
This really sounds pointless to me. How many sockets do you create per second? |
I'm with Antoine, this is *really* going too far. |
OK, let's forget about it. |
I don't see what I can do against a -10 vote! :-) I opened the issue bpo-19827 for the simple syscall optimization. |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: