[tasks] Add a new background helper 'tasks' extension.
This commit is contained in:
82
docs/ext/tasks/index.rst
Normal file
82
docs/ext/tasks/index.rst
Normal file
@ -0,0 +1,82 @@
|
||||
``discord.ext.tasks`` -- asyncio.Task helpers
|
||||
====================================================
|
||||
|
||||
One of the most common operations when making a bot is having a loop run in the background at a specified interval. This pattern is very common but has a lot of things you need to look out for:
|
||||
|
||||
- How do I handle :exc:`asyncio.CancelledError`?
|
||||
- What do I do if the internet goes out?
|
||||
- What is the maximum number of seconds I can sleep anyway?
|
||||
|
||||
The goal of this discord.py extension is to abstract all these worries away from you.
|
||||
|
||||
Recipes
|
||||
---------
|
||||
|
||||
A simple background task in a :class:`~discord.ext.commands.Cog`:
|
||||
|
||||
.. code-block:: python3
|
||||
|
||||
from discord.ext import tasks, commands
|
||||
|
||||
class MyCog(commands.Cog):
|
||||
def __init__(self):
|
||||
self.index = 0
|
||||
self.printer.run()
|
||||
|
||||
def cog_unload(self):
|
||||
self.printer.cancel()
|
||||
|
||||
@tasks.loop(seconds=5.0)
|
||||
async def printer(self):
|
||||
print(self.index)
|
||||
self.index += 1
|
||||
|
||||
Adding an exception to handle during reconnect:
|
||||
|
||||
.. code-block:: python3
|
||||
|
||||
import asyncpg
|
||||
from discord.ext import tasks, commands
|
||||
|
||||
class MyCog(commands.Cog):
|
||||
def __init__(self, bot):
|
||||
self.bot = bot
|
||||
self.data = []
|
||||
self.batch_update.add_exception_type(asyncpg.PostgresConnectionError)
|
||||
self.batch_update.run()
|
||||
|
||||
def cog_unload(self):
|
||||
self.batch_update.cancel()
|
||||
|
||||
@tasks.loop(minutes=5.0)
|
||||
async def batch_update(self):
|
||||
async with self.bot.pool.acquire() as con:
|
||||
# batch update here...
|
||||
pass
|
||||
|
||||
Looping a certain amount of times before exiting:
|
||||
|
||||
.. code-block:: python3
|
||||
|
||||
from discord.ext import tasks
|
||||
|
||||
@tasks.loop(seconds=5.0, count=5)
|
||||
async def slow_count():
|
||||
print(slow_count.current_loop)
|
||||
|
||||
slow_count.run()
|
||||
|
||||
Doing something after a task finishes is as simple as using :meth:`asyncio.Task.add_done_callback`:
|
||||
|
||||
.. code-block:: python3
|
||||
|
||||
afterwards = lambda f: print('done!')
|
||||
slow_count.get_task().add_done_callback(afterwards)
|
||||
|
||||
API Reference
|
||||
---------------
|
||||
|
||||
.. autoclass:: discord.ext.tasks.Loop()
|
||||
:members:
|
||||
|
||||
.. autofunction:: discord.ext.tasks.loop
|
Reference in New Issue
Block a user