如何实现Python中两函数同时运行?Discord Bot脚本问题求助
问题分析与解决方案
核心问题
你的代码中bot.run(token)是阻塞式调用,它会启动Discord Bot的事件循环并一直占据主线程,直到Bot停止运行,因此后续的success()函数永远不会被执行。此外,线程方案中input失效是因为该函数必须在主线程运行,子线程调用会存在兼容性问题。
解决思路
- 替换阻塞的
bot.run()为异步的bot.start(),配合asyncio手动管理事件循环,避免主线程被完全占用。 - 利用Discord.py的
on_ready事件触发成功提示——这是Bot完成登录、准备就绪的准确时机,比在启动代码后直接输出更可靠。 - 在主线程中处理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
相关产品推荐
相关产品推荐

