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()
- 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.
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()