如何在 Python 之后 运行 一个异步任务?

How to run an asynchronous task later in Python?

我正在使用 discord.py 异步版本,我需要在用户加入服务器 10.5 分钟后分配角色。我正在考虑使用 threading.Timer(..)member.add_roles(...) 是协程,因此 Timer 不会 await 它。

我尝试了使用 loop.call_later(...) 的替代方法,但在我的测试中,我得到一个 RuntimeWarning,我的协程添加角色 add_roles 从未等待。到目前为止,这是我尝试过的:

import discord, asyncio
from discord.utils import get

client = discord.Client()

async def on_member_join(member):
    ...
    newuser, noparty = get(member.guild.roles, name="New Member"), get(member.guild.roles, name="No Party")
    async def add_roles(member, newuser, noparty):
        await member.add_roles(newuser, noparty, reason="Auto-role new users.")
    loop = asyncio.get_event_loop()
    loop.call_later(630, add_roles, member, newuser, noparty)

预期结果是 10.5 分钟后,成员将被分配 New UserNo Party 角色,但我得到的是上述 RuntimeWarning。我的问题是:这是正确的方法吗?或者我可以简单地使用 asyncio.sleep(630) 因为我的程序的其余部分是异步函数吗?感谢任何帮助。

await asyncio.sleep(630)

应该可以正常工作。

如果您在 on_member_join 中有其他不想等待 10 分钟的事情,您可以将其设置为 运行 作为 asyncio task

async def give_permission_later(member, newuser, noparty):
    await asyncio.sleep(630)
    await member.add_roles(newuser, noparty, reason="Auto-role new users.")

async def on_member_join(member):
    ...
    newuser, noparty = get(member.guild.roles, name="New Member"), get(member.guild.roles, name="No Party")
    client.loop.create_task(give_permission_later(member, newuser, noparty))
    # More code that should execute now