Ric*_*kes 3 python python-asyncio discord discord.py
首先,道歉。我对 Python 还很陌生。我有 Java/C# 编码背景。我在很多方面都喜欢 Python 的简单性,但也发现一些标准很难确定。
例如,我已经成功地运行了一个 Discord 机器人。异步方法运行良好。但我想安排一个作业每(比如)30 分钟运行一次。然而,当我输入 asyncio.run(job()) 时,Python 告诉我“run”不是 asyncio 的属性。我真的不知道为什么会这么说。哎呀,asyncio 是做到这一点的“正确”方法吗?
有没有可能不和谐的导入以某种方式掩盖了它?我想我可能需要买本书什么的!
再次感谢。我确实尝试对此进行搜索,但没有任何结果!
on_ready
当不和谐机器人启动时被调用,所以一种方法是将你的工作附加到它:
import discord
import asyncio
client = discord.Client()
@client.event
async def on_ready():
while True:
await asyncio.sleep(30*60) # every 30 minutes
job()
client.run(os.environ.get('DISCORD_BOT_SECRET')) # provide your API token here!!
Run Code Online (Sandbox Code Playgroud)
asyncio.sleep
是一种非阻塞睡眠——如果在这里使用time.sleep
,那么机器人将等待time.sleep
完成,并且不会响应任何其他传入的消息。但是,所做的await asyncio.sleep
是将控制权交还给事件循环,事件循环可以处理其他机器人功能。30分钟后控制权才会恢复on_ready
。
请注意,当您的作业运行时,它会阻止您的机器人,这对于任务任务时间超过几秒的作业来说是一个问题。如果您的工作是基于 I/O 的(例如获取网站),您可以使用异步 I/O 操作(例如 aiohttp)来保持响应。如果您的作业是基于 CPU 的,您可能必须使用多个进程,例如subprocess.Popen
您的作业可以使用终端命令调用。