-
-
Save Kavan72/84d18e6a2748298f737d1fa41d03333c to your computer and use it in GitHub Desktop.
[Repeat every] Example FastAPI code to run a function every X seconds #fastapi
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Copied from code shared on Gitter (https://gitter.im/tiangolo/fastapi) by @dmontagu | |
# Decorator for fastapi | |
def repeat_every(*, seconds: float, wait_first: bool = False): | |
def decorator(func: Callable[[], Optional[Awaitable[None]]]): | |
is_coroutine = asyncio.iscoroutinefunction(func) | |
@wraps(func) | |
async def wrapped(): | |
async def loop(): | |
if wait_first: | |
await asyncio.sleep(seconds) | |
while True: | |
try: | |
if is_coroutine: | |
await func() | |
else: | |
await run_in_threadpool(func) | |
except Exception as e: | |
logger.error(str(e)) | |
await asyncio.sleep(seconds) | |
create_task(loop()) | |
return wrapped | |
return decorator | |
# Use it like so: | |
@app.on_event("startup") | |
@repeat_every(seconds=24 * 60 * 60) # 24 hours | |
async def remove_expired_tokens_task(): | |
_ = await remove_expired_tokens() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment