首先,道歉。我对Python很陌生。我来自Java / C#编码背景。我在很多方面都喜欢Python的简单性,但同时也发现一些难以确定的标准。
例如,我已经成功设法使Discord Bot运行。异步方法运行良好。但是我想安排一份工作,每30分钟运行一次。但是,当我键入asyncio.run(job())时,Python告诉我“ run”不是asyncio的属性。我真的不确定为什么会这样说。哎呀,asyncio甚至是做到这一点的“正确”方法吗?
不和谐的导入是否可能以某种方式掩盖了它?我想我可能需要看书或其他东西!
再次,谢谢。我确实尝试过搜索,但是没有任何反应!
[on_ready
在discord机器人启动时被调用,因此一种方法是将您的作业附加到它:
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!!
asyncio.sleep
是non-blocking睡眠-如果在此处使用time.sleep
,则该漫游器将等待time.sleep
完成,并且将不响应其他任何传入的消息。但是await asyncio.sleep
的作用是将收益控制权返回到事件循环,该事件循环可以处理其他机器人功能。只有在30分钟之后,控制权才会返回on_ready
。
请注意作业运行时会阻止您的漫游器,这对于任务时间超过几秒钟的作业来说是个问题。如果您的工作是基于I / O的(例如,获取网站),则可以使用异步I / O操作(例如aiohttp)来使其保持响应状态。如果您的作业是基于CPU的,则可能必须使用多个进程,例如subprocess.Popen
(如果您的作业可以使用终端命令来调用。)>