In earlier versions of Python all the way to 3.13, it would not allow a server to listen on a port that has already been used, and rightfully so.
$ python -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
# Trying to start the second server on the same port
$ python -m http.server 8000
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "/usr/lib/python3.11/http/server.py", line 1309, in<module>
test(
File "/usr/lib/python3.11/http/server.py", line 1256, intest
with ServerClass(addr, HandlerClass) as httpd:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/socketserver.py", line 456, in __init__
self.server_bind()
File "/usr/lib/python3.11/http/server.py", line 1303, in server_bind
returnsuper().server_bind()
^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/http/server.py", line 136, in server_bind
socketserver.TCPServer.server_bind(self)
File "/usr/lib/python3.11/socketserver.py", line 472, in server_bind
self.socket.bind(self.server_address)
OSError: [Errno 98] Address already in use
But in Python 3.14.0a2, the second command would also start a server without exception. Is that expected?
I confirm this in the main. It seems, for two processes, the last started process - serves requests. If it's terminated - works the first.
At least, seems as a documentation issue for me (nothing in news).
Based on #120485 (comment) (thanks for the finding, @oskar-skog ), "the kernel may dispatch the request to different server process randomly", which is concerning.
Activity
skirpichev commented on Nov 27, 2024
I confirm this in the main. It seems, for two processes, the last started process - serves requests. If it's terminated - works the first.
At least, seems as a documentation issue for me (nothing in news).
oskar-skog commented on Nov 27, 2024
I believe it's caused by this commit:
192d17c
See also comment: #120485 (comment)
Maybe allow_reuse_port should default to False?
rayluo commented on Nov 27, 2024
Based on #120485 (comment) (thanks for the finding, @oskar-skog ), "the kernel may dispatch the request to different server process randomly", which is concerning.
+1
musicinmybrain commented on Jun 4, 2025
I can still reproduce this (and AzureAD/microsoft-authentication-library-for-python#768) on Python 3.14.0b2. Is there any plan to change this behavior before the 3.14.0 final release?
pythongh-127319: Disable port reuse on HTTP, XMLRPC, and logging TCP …
gh-127319: Disable port reuse on HTTP, XMLRPC, and logging TCP servers (
pythongh-127319: Disable port reuse on HTTP, XMLRPC, and logging TCP …
pythongh-127319: Disable port reuse on HTTP, XMLRPC, and logging TCP …
[3.14] gh-127319: Disable port reuse on HTTP, XMLRPC, and logging TCP…
pythongh-127319: Disable port reuse on HTTP, XMLRPC, and logging TCP …
pythongh-127319: Disable port reuse on HTTP, XMLRPC, and logging TCP …
pythongh-127319: Disable port reuse on HTTP, XMLRPC, and logging TCP …
pythongh-127319: Disable port reuse on HTTP, XMLRPC, and logging TCP …