如何在 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 User
和 No 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
我正在使用 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 User
和 No 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