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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:32:47