我有一个本地运行的 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.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()