Python background service / alle x sekunden was ausführen?
Das Szenario: Ich hab ne API laufen die per post request einen Service starten und stoppen soll. Der Service soll alle paar Sekunden etwas tun.
Code:
from fastapi import FastAPI
from testService import Service
import time
app = FastAPI()
@app.get("/")
def index():
#hier später Service start / stop callen (und post draus machen)
return { "message": "hello world"}
service = Service()
service.start()
time.sleep(20)
service.stop()
Und der service:
import sched, time
class Service:
scheduler = sched.scheduler(time.time, time.sleep)
running = False
interval = 5
def start(self):
self.running = True
self.task(None)
self.scheduler.run()
def stop(self):
self.running = False
if(self.event):
self.scheduler.cancel(self.event)
def task(self, nothing):
if(self.running):
self.event = self.scheduler.enter(self.interval, 1, self.task, (self,))
print("test")
#hier dann der Code, der alle paar Sekunden ausgeführt werden soll
Das Problem: self.scheduler.run() blockt den Main Thread, und die Lösung ist wohl ne Schleife darum, aber das sieht irgendwie nach dem falschen Ansatz aus und ich weiß nicht ob das sich nicht vlt mit den API Endpoints beißt...
Wie mache ich das richtig?
1 Antwort
Ich kenn die Bibliothek scheduler nicht, aber wenn sie ein awaitable Objekt zurückgibt, kannst du einfach eine async Methode draus machen und self.scheduler.run() awaiten:
async def start(self):
self.running = True
self.task(None)
await self.scheduler.run()
Falls das nicht geht, wirst du um threading nicht herumkommen.