带有 Discord 的多线程(预定作业)

Ric*_*kes 3 python python-asyncio discord discord.py

首先,道歉。我对 Python 还很陌生。我有 Java/C# 编码背景。我在很多方面都喜欢 Python 的简单性,但也发现一些标准很难确定。

例如,我已经成功地运行了一个 Discord 机器人。异步方法运行良好。但我想安排一个作业每(比如)30 分钟运行一次。然而,当我输入 asyncio.run(job()) 时,Python 告诉我“run”不是 asyncio 的属性。我真的不知道为什么会这么说。哎呀,asyncio 是做到这一点的“正确”方法吗?

有没有可能不和谐的导入以某种方式掩盖了它?我想我可能需要买本书什么的!

再次感谢。我确实尝试对此进行搜索,但没有任何结果!

xjc*_*jcl 6

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您的作业可以使用终端命令调用。