【问题标题】:How to run multiple Discord clients simultaneously如何同时运行多个 Discord 客户端
【发布时间】: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


【解决方案1】:

最简单的方法是使用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
    )

它将在后台启动所有文件。

【讨论】:

  • 谢谢!这可能不是最干净的方法,但它确实有效。
  • 可能不是,如果你熟悉Docker,你可能想用docker compose
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
相关资源
最近更新 更多