Telegram Bot:如何在独立线程的同步函数中发送消息?
解决方案
核心问题是你在同步线程里直接调用了异步协程函数,必须把协程提交到Telegram Bot的事件循环中执行,以下是两种无需修改Game.start为异步的可行方案:
方案1:使用asyncio.run_coroutine_threadsafe
通过该函数将异步协程提交到Bot的事件循环中,线程安全地执行异步操作:
import asyncio # 在你的Game线程逻辑中 def send_game_message(context, user_id, text): # 获取Bot使用的事件循环(python-telegram-bot v20+可通过context.application.loop获取) loop = context.application.loop # 创建发送消息的协程 coro = context.bot.send_message(chat_id=user_id, text=text) # 提交协程到事件循环执行 asyncio.run_coroutine_threadsafe(coro, loop)
方案2:使用Bot Application的create_task方法
如果使用的是python-telegram-bot v20及以上版本,直接用application.create_task更简洁,它会自动处理事件循环的线程安全问题:
# 在你的Game线程逻辑中 def send_game_message(context, user_id, text): # 创建异步任务并提交到事件循环 context.application.create_task( context.bot.send_message(chat_id=user_id, text=text) )
注意事项
- 确保获取的事件循环是Telegram Bot实例正在运行的那个,不要新建独立的事件循环,否则会导致消息无法发送。
- 两种方法都不需要改动
Game.start的同步性质,完全适配你当前的线程架构。
内容的提问来源于stack exchange,提问作者iljuhenson
相关产品推荐
相关产品推荐

