以后如何在Python中运行异步任务?

时间:2019-08-31 21:03:39

标签: python asynchronous python-3.6 discord.py python-asyncio

我使用的是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)?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

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