FastAPI 本地服务器:每个请求都使用不同的端口 -> port in use error

问题描述 投票:0回答:1

我有一个本地运行的 FastAPI 服务器。我像这样用 uvicorn 启动它:

uvicorn app:app --port 5000

我正在查询它 frpm Python,像这样:

response = requests.post(rf"http://127.0.0.1:5000/endpoint1/", json={"arg1": "somevalue})

当我查看我的 FastAPI 日志时,我看到每个请求都来自不同的端口并且在每个新端口上递增:

...
INFO:     127.0.0.1:59605 - "POST /endpoint1/ HTTP/1.1" 200 OK
INFO:     127.0.0.1:59606 - "POST /endpoint2/ HTTP/1.1" 200 OK
INFO:     127.0.0.1:59607 - "POST /endpoint1/ HTTP/1.1" 200 OK
INFO:     127.0.0.1:59608 - "POST /endpoint2/ HTTP/1.1" 200 OK
INFO:     127.0.0.1:59609 - "POST /endpoint1/ HTTP/1.1" 200 OK
INFO:     127.0.0.1:59610 - "POST /endpoint2/ HTTP/1.1" 200 OK
INFO:     127.0.0.1:59611 - "POST /endpoint1/ HTTP/1.1" 200 OK
INFO:     127.0.0.1:59612 - "POST /endpoint2/ HTTP/1.1" 200 OK
INFO:     127.0.0.1:59613 - "POST /endpoint1/ HTTP/1.1" 200 OK
INFO:     127.0.0.1:59614 - "POST /endpoint2/ HTTP/1.1" 200 OK

一段时间后,这会导致问题,因为所有端口都已用尽(我认为;在端口 65535)。具体来说,这个错误:

requests.exceptions.ConnectionError: HTTPConnectionPool(host='127.0.0.1', port=5000): Max retries exceeded with url: /endpoint1/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x000001BC822DDC40>: Failed to establish a new connection: [WinError 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted'))

我按顺序执行请求(不是并行!),那么有没有办法确保请求总是通过同一个端口发送?或者避免这个问题的另一种解决方案?

python-requests port fastapi local
1个回答
0
投票

所以解释是每个请求都在一个新的连接上服务,并被分配一个新的端口号。请求来得太快了,似乎端口没有足够快地关闭/重新打开,Python 用完了它认为可用的端口。

解决方案是通过一个

requests.Session
完成所有请求。请注意下面的
session.post
而不是
requests.post
.

session = requests.Session()
response = session.post(rf"http://127.0.0.1:5000/token_exists_in_ft/", json={"token": token, "lang": lang})
# ... other requests
session.close()
© www.soinside.com 2019 - 2024. All rights reserved.