You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Python中两函数同时运行?Discord Bot脚本问题求助

问题分析与解决方案

核心问题

你的代码中bot.run(token)是阻塞式调用,它会启动Discord Bot的事件循环并一直占据主线程,直到Bot停止运行,因此后续的success()函数永远不会被执行。此外,线程方案中input失效是因为该函数必须在主线程运行,子线程调用会存在兼容性问题。

解决思路

  1. 替换阻塞的bot.run()为异步的bot.start(),配合asyncio手动管理事件循环,避免主线程被完全占用。
  2. 利用Discord.py的on_ready事件触发成功提示——这是Bot完成登录、准备就绪的准确时机,比在启动代码后直接输出更可靠。
  3. 在主线程中处理Token输入,确保input功能正常工作。

修改后的完整代码

import asyncio
from discord.ext import commands
from discord import LoginFailure, DiscordException
from colorama import Fore
import sys
import random

bot = commands.Bot(command_prefix='t.', help_command=None)
system_prefix = f'\n{Fore.LIGHTMAGENTA_EX}> {Fore.LIGHTGREEN_EX}'

@bot.event
async def on_ready():
    # Bot成功登录并准备就绪时触发
    try:
        sys.stdout.write(system_prefix + f'Success! Logged in as {bot.user}')
        sys.stdout.flush()
        await asyncio.sleep(random.uniform(0.01, 0.1))
    except Exception as e:
        print(f'{system_prefix}Error: {e}')

async def main():
    # 主线程获取Token,避免线程干扰input
    token = input(system_prefix + "Enter your token: ")
    try:
        # 异步启动Bot,await会持续运行直到Bot关闭
        await bot.start(token)
    except LoginFailure:
        print(system_prefix + "Invalid token! Please try again.")
        await main()  # 支持重新输入Token
    except DiscordException as e:
        print(system_prefix + f"Discord service error: {e}")
    except Exception as e:
        print(system_prefix + f"Unexpected error: {e}")

if __name__ == "__main__":
    asyncio.run(main())

关键改动说明

  • on_ready事件:替代原success()函数,仅在Bot完全准备好后输出成功信息,避免提前触发。
  • 异步主函数main():先在主线程处理Token输入,再通过await bot.start(token)启动Bot,既保证input正常工作,又能正确执行Bot的事件循环。
  • 精准异常捕获:替换裸except:为具体异常类型,让用户能明确错误原因(如无效Token、Discord服务异常等)。

内容的提问来源于stack exchange,提问作者toxxicity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 11:18:13