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

VLang多线程批量请求网站出现dial_tcp failed错误如何解决?

VLang多线程请求dial_tcp failed问题修复

错误原因

  • 未限制协程池并发数:默认PoolProcessor会为每个任务启动一个工作协程,100个请求瞬间发起会导致本地临时端口耗尽、或目标站点触发同源并发连接限流,直接返回拨号失败。
  • HTTP连接未复用:默认http.get每次请求都会新建TCP连接,短时间大量新建连接极易被目标站点拦截,也会加剧端口占用问题。
  • 其他潜在问题:部分地区无法正常连通Google服务、原代码缺失utf8依赖导入、未配置请求超时,也会引发请求异常。

修复方案

  1. 限制协程池最大工作协程数,将并发控制在合理范围(通常10以内即可),避免瞬间并发过高。
  2. 配置http.Client实例并全局复用,开启TCP连接复用能力,减少新建连接的开销。
  3. 补充必要依赖导入、增加请求超时配置、及时释放响应体资源。

修复后完整代码

module main

import net.http
import sync.pool
import utf8
import time

struct IResult {
    u string
    c int
}

// 全局复用HTTP客户端,自动维护连接池
const (
    http_client = http.Client{
        timeout: 10 * time.second
        max_connections_per_host: 5 // 限制单域名最大连接数,避免触发站点限流
    }
)

fn sprocess(pp &pool.PoolProcessor, idx int, wid int) &IResult {
    item := pp.get_item<string>(idx)

    resp := http_client.get(item) or {
        println('Err [ for $item ]: $err.msg')
        return &IResult{item, 0}
    }
    defer {
        resp.body.close()
    }

    return &IResult{
        u: item
        c: utf8.utf8_str_len(resp.text)
    }
}

fn main() {
    // 配置最大工作协程数为8
    mut pp := pool.new_pool_processor(callback: sprocess, max_workers: 8)
    // 测试建议替换为可正常访问的站点,比如把Google换为百度
    pp.work_on_items(['https://www.bing.com', 'https://www.baidu.com'].repeat(50))

    for x in pp.get_results<IResult>() {
        println('$x.u len = $x.c')
    }
}

额外优化建议

  • 可对请求失败的任务增加最多3次重试逻辑,进一步降低偶发网络波动带来的失败率。
  • 若需访问Google站点,请先确保网络环境可正常连通对应服务。

内容的提问来源于stack exchange,提问作者lprakashv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:24:01