Loops#
Loops are a utility built into arc
that allow you to repeatedly call an async def
function with a given interval (E.g. every 30 seconds, or every hour).
To create a loop, you should decorate an async function with either @arc.utils.interval_loop()
or @arc.utils.cron_loop()
, depending on your usecase.
Warning
If you want to use @arc.utils.cron_loop()
(or CronLoop
), you should install arc
with the cron
extra:
# Create a loop out of a function
@arc.utils.interval_loop(seconds=10.0)
async def loopy_loop(value: int) -> None:
print(value)
# Somewhere else:
@client.add_startup_hook
async def startup(client: arc.GatewayClient) -> None:
# Start the loop by passing all the parameters it needs
loopy_loop.start(value=10)
# Create a loop out of a function
@arc.utils.interval_loop(seconds=10.0)
async def loopy_loop(value: int) -> None:
print(value)
# Somewhere else:
@client.add_startup_hook
async def startup(client: arc.RESTClient) -> None:
# Start the loop by passing all the parameters it needs
loopy_loop.start(value=10)
If a decorator doesn't suit your needs, you may also use the IntervalLoop
and CronLoop
classes directly:
async def loopy_loop(value: int) -> None:
print(value)
# Create a loop by passing the function in
loop = arc.utils.IntervalLoop(loopy_loop, seconds=10.0)
# Somewhere else:
@client.add_startup_hook
async def startup(client: arc.GatewayClient) -> None:
# Start the loop by passing all the parameters it needs
loop.start(value=10)
async def loopy_loop(value: int) -> None:
print(value)
# Create a loop by passing the function in
loop = arc.utils.IntervalLoop(loopy_loop, seconds=10.0)
# Somewhere else:
@client.add_startup_hook
async def startup(client: arc.RESTClient) -> None:
# Start the loop by passing all the parameters it needs
loop.start(value=10)
This is identical to using the decorator from above.
To stop a loop after the next iteration, you can call .stop()
on it, to cancel it (even mid-iteration!), call .cancel()
.