Wie kann die Ausführung des FastAPI-Endpunkts nach einer bestimmten Zeit gestoppt werden, um die CPU-Ressourcennutzung/-Python

Python-Programme
Guest
 Wie kann die Ausführung des FastAPI-Endpunkts nach einer bestimmten Zeit gestoppt werden, um die CPU-Ressourcennutzung/-

Post by Guest »

Anwendungsfall
Der Client-Mikrodienst, der /do_something aufruft, hat beim Aufruf von request/post() eine Zeitüberschreitung von 60 Sekunden. Dieses Timeout ist festgelegt und kann nicht geändert werden. Wenn also /do_something 10 Minuten dauert, verschwendet /do_something CPU-Ressourcen, da der Client-Mikrodienst NICHT nach 60 Sekunden auf die Antwort von /do_something wartet, was 10 Minuten lang CPU verschwendet und das erhöht die Kosten. Unser Budget ist begrenzt.
Der aktuelle Code sieht so aus:

Code: Select all

import time
from uvicorn import Server, Config
from random import randrange
from fastapi import FastAPI

app = FastAPI()

def some_func(text):
"""
Some computationally heavy function
whose execution time depends on input text size
"""
randinteger = randrange(1,120)
time.sleep(randinteger)# simulate processing of text
return text

@app.get("/do_something")
async def do_something():
response = some_func(text="hello world")
return {"response": response}

# Running
if __name__ == '__main__':
server = Server(Config(app=app, host='0.0.0.0', port=3001))
server.run()
Gewünschte Lösung
  • Hier sollte /do_something die Verarbeitung der aktuellen Anfrage stoppen Endpunkt nach 60 Sekunden und warten Sie auf die Verarbeitung der nächsten Anfrage.
  • Wenn die Ausführung des Endpunkts nach 60 Sekunden zwangsweise gestoppt wird, sollte dies möglich sein um es mit einer benutzerdefinierten Nachricht zu protokollieren.
  • Dies sollte den Dienst nicht beenden und mit Multithreading/Multiprocessing funktionieren.
Ich habe es versucht Das. Aber wenn eine Zeitüberschreitung auftritt, wird der Server getötet.
Gibt es eine Lösung, um das Problem zu beheben?

Code: Select all

import logging
import time
import timeout_decorator
from uvicorn import Server, Config
from random import randrange
from fastapi import FastAPI

app = FastAPI()

@timeout_decorator.timeout(seconds=2, timeout_exception=StopIteration, use_signals=False)
def some_func(text):
"""
Some computationally heavy function
whose execution time depends on input text size
"""
randinteger = randrange(1,30)
time.sleep(randinteger)# simulate processing of text
return text

@app.get("/do_something")
async def do_something():
try:
response = some_func(text="hello world")
except StopIteration:
logging.warning(f'Stopped /do_something > endpoint due to timeout!')
else:
logging.info(f'(  Completed < /do_something > endpoint')

return {"response": response}

# Running
if __name__ == '__main__':
server = Server(Config(app=app, host='0.0.0.0', port=3001))
server.run()

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post