多线程启动双Bot失败:仅首个线程运行问题求助
问题分析与解决方案
问题根源
你遇到的核心问题有两个:
vkbot.run_forever()和bot.run(token=token)都是阻塞式同步方法,直接调用时第一个方法会占用当前线程直到程序终止,第二个方法根本没机会执行。- 你之前的线程写法存在错误:
args=(vkbot.run_forever(),)是直接执行了run_forever()方法(而非把方法作为线程的执行目标),导致主线程先被该方法阻塞,线程根本无法启动。
解决方案
方案1:修复线程调用逻辑
把方法本身作为线程目标,不要在args里直接执行方法(即不要加括号),正确写法如下:
from vkbottle.bot import Bot, Message import threading, discord from discord import commands vkbot = Bot(token=vk_token) bot = commands.Bot(command_prefix="+", intents=intents) @vkbot.on.message() async def main(message: Message): if message.text.lower().startswith("+reg"): await message.answer("something") @bot.event async def on_ready(): print(f"Logged in as {bot.user} (ID: {bot.user.id})") # 正确的线程启动方式 threading.Thread(target=vkbot.run_forever).start() threading.Thread(target=bot.run, args=(token,)).start()
这样两个线程会分别启动两个Bot的阻塞方法,实现并行运行。
方案2:使用asyncio异步运行(更推荐)
因为VKbottle和Discord.py都是基于asyncio的异步库,用同一个事件循环运行两个Bot的异步任务更高效,无需额外线程/进程:
import asyncio from vkbottle.bot import Bot, Message import discord from discord import commands vk_token = "你的VK令牌" discord_token = "你的Discord令牌" intents = discord.Intents.default() intents.message_content = True # 根据需求开启对应的意图权限 vkbot = Bot(token=vk_token) bot = commands.Bot(command_prefix="+", intents=intents) @vkbot.on.message() async def main(message: Message): if message.text.lower().startswith("+reg"): await message.answer("something") @bot.event async def on_ready(): print(f"Logged in as {bot.user} (ID: {bot.user.id})") async def run_bots(): # 创建两个异步任务 vk_task = asyncio.create_task(vkbot.run_polling()) discord_task = asyncio.create_task(bot.start(discord_token)) # 等待两个任务持续运行 await asyncio.gather(vk_task, discord_task) if __name__ == "__main__": try: asyncio.run(run_bots()) except KeyboardInterrupt: print("程序已退出")
注意:Discord.py的bot.run()是同步方法,这里改用异步的bot.start();VKbottle的run_polling()是异步运行方法(若你的版本不支持,可换回线程方案)。
内容的提问来源于stack exchange,提问作者adshdsa
相关产品推荐
相关产品推荐

