如何在不阻塞主应用程序的情况下异步运行 Telegram 机器人轮询(使用 python-telegram-bot 版本 >= 20)?

问题描述 投票:0回答:1

我正在尝试使用

python-telegram-bot library
(版本 >= 20)以异步模式运行 Telegram 机器人。问题是,当我开始轮询时,整个应用程序都会阻塞。我尝试过同时使用线程和
asyncio.create_task()
来防止轮询阻塞主应用程序,但我不断遇到各种错误。

错误

RuntimeError: This event loop is already running<br>
RuntimeError: Cannot close a running event loop

我尝试了各种解决方案但没有成功。有没有人在该库中遇到过这种情况,并且可以建议一个明确的解决方案来异步运行轮询而不阻塞主应用程序?

python telegram python-telegram-bot
1个回答
0
投票

您遇到的错误与 Python 中异步事件循环的管理方式有关,尤其是使用 asyncio 时。当您在异步模式下使用 python-telegram-bot 版本 >= 20 时,它依赖 asyncio 来管理机器人的轮询和其他 I/O 操作。

使用 asyncio 的解决方案:

import asyncio
from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    await update.message.reply_text('Hello! I am your bot.')

async def run_bot():
    application = Application.builder().token('YOUR_BOT_TOKEN').build()
    application.add_handler(CommandHandler('start', start))
    await application.run_polling()

async def main():
    bot_task = asyncio.create_task(run_bot())
    await bot_task  # Add other async tasks if needed

if __name__ == '__main__':
    asyncio.run(main())
© www.soinside.com 2019 - 2024. All rights reserved.