我们知道 python-telegram-bot 使用 asyncio。但一切都发生在主线程内。
在这种情况下,我需要在另一个线程中运行异步函数。
这样做的主要目的是因为我正在使用一些计算并获取需要一些时间的数据。但在此期间,整个机器人正在等待任务完成,不会对您的任何请求做出任何响应。所以我有两个选择。第一个是使用 API 来加速任务。第二个是在另一个线程内运行计算。但它必须是异步的,我不知道该怎么做。我在谷歌上搜索了一下,发现了一些方法,例如
asyncio.run_coroutine_threadsafe(coro, loop)
我该怎么做呢?
我的部分代码=>
async def OptimizedSearch(context: ContextTypes.DEFAULT_TYPE) -> None:
# Fetching Data and Some Calculations Here
# It will take time (a few seconds or minutes)
await context.bot.send_message(
chat_id=context.job.chat_id,
text=result
)
async def run_script(update: Update, context: ContextTypes.DEFAULT_TYPE):
job = context.job_queue.run_repeating(OptimizedSearch, 10*60, first=5, chat_id=chat_id, name="optimized_search")
您可以通过使用 async/await 和异步 HTTP 请求来异步获取数据,而无需创建额外的线程。这种方法允许您执行非阻塞操作。
这是使用 httpx 的 GET 请求的示例:
async with httpx.AsyncClient() as client:
result = await client.get('https://example.com')