我已经使用discord.py库创建了一些机器人程序,现在我想构建一个“dispatcher”,读取配置文件并启动它们。我的每个机器人都是从抽象机器人类扩展而来的一个类。然而,我一直坚持同时运行它们。以下是我尝试过的一些事情:
使用线程。如: 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
etc阻塞,直到子进程结束(即bot被终止)。我也不喜欢使用这种方法,因为它是bi
创建任务并将其放在单个 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
,但我还没有找到任何方法来做到这一点。
1条答案
按热度按时间tuwxkamq1#
最简单的方法是使用
subprocess.Popen
```import sys
import subprocess
files = ["bot1.py", "bot2.py", ...]
for f in files:
subprocess.Popen(
[sys.executable, f], stdout=subprocess.PIPE, stderr=subprocess.PIPE
)