Дублирование запросов

Запускаю uvicorn с fastAPI.

PYTHONPATH=. main:app --workers=2 --port=8080 --host=0.0.0.0

Следующий пример:

import time
from multiprocessing import Lock
import fastapi


app = fastapi.FastAPI()
lock = Lock()


import os
p = os.getpid()
print('start', p)


@app.get('/health', status_code=204)
async def health():
    lock.acquire()
    print(p)
    time.sleep(5)
    lock.release()
    return

Захожу в браузер. Открываю 3 вкладки и последовательно, делаю 3 запроса так, чтобы уложиться в таймаут 5 секунд. В консоли вижу:

PYTHONPATH=. main:app --workers=2 --port=8080 --host=0.0.0.0
INFO:     Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
INFO:     Started parent process [8799]
start 8802
INFO:     Started server process [8802]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
start 8801
INFO:     Started server process [8801]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
8801
INFO:     127.0.0.1:57484 - "GET /health HTTP/1.1" 204 No Content
8802
8801
INFO:     127.0.0.1:57488 - "GET /health HTTP/1.1" 204 No Content
INFO:     127.0.0.1:57494 - "GET /health HTTP/1.1" 204 No Content
8802
INFO:     127.0.0.1:57502 - "GET /health HTTP/1.1" 204 No Content
8801
INFO:     127.0.0.1:57510 - "GET /health HTTP/1.1" 204 No Content

Видно, что прошло, 5 запросов. Почему так происходит? Почему 5 вместо 3х. Если я сделаю 2 запроса, то увижу 3 вывода вместо 2х.


Ответы (1 шт):

Автор решения: hedgehogues

Данная проблема не воспроизводится, если воспользоваться curl и сделать 3 одновременных запроса:

curl http://localhost:8080/health
→ Ссылка