Uvicorn+FastAPI неравномерно балансирует запросы между работниками uvicornPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Uvicorn+FastAPI неравномерно балансирует запросы между работниками uvicorn

Сообщение Anonymous »

Я не понимаю, как работает балансировка нагрузки Uvicorn.
Вот код воспроизведения:

Код: Выделить всё

import time
from fastapi import FastAPI
from concurrent.futures import ThreadPoolExecutor
import asyncio
import os
import random

app = FastAPI()
executor = ThreadPoolExecutor(max_workers=1)
loop = asyncio.get_event_loop()

class SomeClass():
def task(self):
random_time = random.randint(2000, 3000) / 1000
time.sleep(random_time)
return f"process id: {os.getpid()}"

@app.get("/test")
async def test():
instance = SomeClass()
result = await loop.run_in_executor(executor, instance.task)
print(result)
return result
Я запускаю сервер uvicorn с помощью:

Код: Выделить всё

uvicorn --workers 2 main:app
Затем я пытаюсь отправить параллельные запросы:

Код: Выделить всё

for i in {1..20}; do curl http://127.0.0.1:8000/test &; done
Ожидания:
  • ~10 запросов обрабатываются 1-м работником
  • ~10 запросов обрабатываются вторым работником.
  • общее время ок. 25 секунд
Реальность:
  • 14 запросов обрабатываются 1-м работником
  • 6 запросов обрабатываются 2-м работником
  • общее время ок. 35 сек.
Выход:

Код: Выделить всё

process id: 56017
process id: 56016
process id: 56017
process id: 56016
process id: 56017
process id: 56016
process id: 56017
process id: 56016
process id: 56017
process id: 56016
process id: 56017
process id: 56017
process id: 56017
process id: 56017
process id: 56017
process id: 56017
process id: 56017
process id: 56017
process id: 56017
Может кто-нибудь объяснить, что происходит? Должно быть, я делаю что-то не так.
Большое спасибо!

РЕДАКТИРОВАТЬ: Я прочитал ваше замечание о том, что time.sleep блокирует цикл событий, но у меня та же проблема, когда я запускаю функцию блокировки в потоке asyncio. Итак, я отредактировал свой код и выходные данные, чтобы отразить это.

Подробнее здесь: https://stackoverflow.com/questions/777 ... rn-workers
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»