【发布时间】:2021-07-08 09:20:10
【问题描述】:
我已经使用 discord.py 库创建了一些机器人,现在我想构建一个“调度程序”来读取配置文件并启动它们。我的每个机器人都是作为从抽象机器人类扩展而来的类创建的。但是,我坚持同时运行它们。这些是我尝试过的一些事情:
- 使用线程。例如:
threading.Thread(target=discord.Client('token').run)).start()。不起作用,因为Client.run()尝试再次启动asyncio事件循环,导致错误 (RuntimeError: Cannot close a running event loop)。 - 使用
os.system/multiprocessing/subprocess。运行包含机器人的.py文件。不起作用,因为os.system等会阻塞,直到子进程结束(即机器人被杀死)。我也不想使用这种方法,因为它是一个双向 - 创建任务并将它们放在单个
asyncio循环中(如下所示)。
我尝试的最后一种方法的 MRE:
import discord
import asyncio
class Bot:
client = discord.Client()
def __init__(self, token):
self.token = token
print('Bot initiated')
@self.client.event
async def on_ready():
print(f'Logged in as {self.client.user}')
@self.client.event
async def on_message(message):
print(message.content)
async def run(self):
print('Bot running')
self.client.run(self.token)
if __name__ == '__main__':
bot1 = Bot('bot token here')
bot2 = Bot('bot token here')
loop = asyncio.get_event_loop()
loop.create_task(bot1.run())
loop.create_task(bot2.run())
loop.run_forever()
这根本不起作用 - 第一个机器人在 run 方法中冻结,甚至从未登录。为了测试,两个机器人都登录到同一个机器人帐户,但这与问题无关。
我认为理想的解决方案是异步运行discord.Client,但我还没有遇到任何方法。
【问题讨论】:
-
看起来就像你想要的,只是每个机器人从命令行发送到后台。您不必在 python 中执行此操作。一个例子是
python my_daemon.py & -
@JakobGuldbergAaes 我可以手动运行它们,但我想创建一个 python 脚本来自动运行它们。
-
然后使用 subprocess.Popen 。从字面上看,它在 python 中被称为 shell。相同但略有不同,但它可以完成工作。
标签: python discord.py python-asyncio