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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:42:50