VLang多线程批量请求网站出现dial_tcp failed错误如何解决?
VLang多线程请求
dial_tcp failed问题修复 错误原因
- 未限制协程池并发数:默认
PoolProcessor会为每个任务启动一个工作协程,100个请求瞬间发起会导致本地临时端口耗尽、或目标站点触发同源并发连接限流,直接返回拨号失败。 - HTTP连接未复用:默认
http.get每次请求都会新建TCP连接,短时间大量新建连接极易被目标站点拦截,也会加剧端口占用问题。 - 其他潜在问题:部分地区无法正常连通Google服务、原代码缺失
utf8依赖导入、未配置请求超时,也会引发请求异常。
修复方案
- 限制协程池最大工作协程数,将并发控制在合理范围(通常10以内即可),避免瞬间并发过高。
- 配置
http.Client实例并全局复用,开启TCP连接复用能力,减少新建连接的开销。 - 补充必要依赖导入、增加请求超时配置、及时释放响应体资源。
修复后完整代码
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
相关产品推荐
相关产品推荐

