基于aiogram的Telegram Bot任务取消触发连接错误求助
问题排查与解决方案
核心原因分析
你遇到的WinError 10061是TCP连接被目标端主动拒绝的错误,结合/start命令取消任务的场景,根源在于:执行/start取消当前任务时,之前正在进行的异步HTTP请求(调用/gen/接口)没有被正确终止,仍然在尝试向目标服务发起连接,而此时目标服务可能因为资源限制、请求上下文失效等原因拒绝了连接。
具体修复方案
1. 为每个用户维护当前任务的异步句柄
在机器人中用字典存储每个用户的活跃异步任务,执行/start时直接终止旧任务:
from aiogram import Bot, Dispatcher from aiogram.types import Message import asyncio # 存储用户活跃任务:key为user_id,value为asyncio.Task对象 active_tasks = {} async def handle_user_request(message: Message): user_id = message.from_user.id # 检查并终止旧任务 if user_id in active_tasks: active_tasks[user_id].cancel() del active_tasks[user_id] await message.reply("已取消之前的任务,现在处理新请求...") # 创建并存储新任务 task = asyncio.create_task(call_gen_api(message)) active_tasks[user_id] = task try: await task except asyncio.CancelledError: pass finally: # 任务结束后清理状态 if user_id in active_tasks: del active_tasks[user_id] async def call_gen_api(message: Message): # 必须使用异步HTTP库,不能用同步的requests import aiohttp try: async with aiohttp.ClientSession() as session: async with session.post( "http://46.101.4.220:32191/gen/", json={"prompt": message.text} ) as resp: result = await resp.json() await message.reply(result.get("response", "生成完成")) except aiohttp.ClientError as e: await message.reply(f"请求失败: {str(e)}")
2. 强制使用异步HTTP客户端
同步HTTP库(如requests)会阻塞事件循环,导致任务取消逻辑无法及时生效,必须使用aiohttp这类异步库,确保请求能被及时终止。
3. 完善任务取消后的资源清理
在请求函数中添加取消时的资源回收逻辑,避免残留无效连接:
async def call_gen_api(message: Message): import aiohttp session = None try: session = aiohttp.ClientSession() async with session.post( "http://46.101.4.220:32191/gen/", json={"prompt": message.text} ) as resp: result = await resp.json() await message.reply(result.get("response", "生成完成")) except asyncio.CancelledError: if session: await session.close() raise # 向上传递取消异常,让上层处理 except aiohttp.ClientError as e: await message.reply(f"请求失败: {str(e)}") finally: if session and not session.closed: await session.close()
4. 验证目标服务可用性
如果上述修复后仍报错,需手动确认目标服务状态:
- 用
curl测试接口:curl -X POST http://46.101.4.220:32191/gen/ -d '{"prompt":"test"}' - 检查目标机器防火墙是否开放32191端口
- 确认目标服务进程是否正常运行
内容的提问来源于stack exchange,提问作者Bohdan Liutko
相关产品推荐
相关产品推荐

