废话少说,直接上源码,需要注意几点在源码后有说明。
package main
import (
"fmt"
"net"
"os"
"sync"
"time"
)
var wg = sync.WaitGroup{}
func main() {
svcs := []string{"127.0.0.1:8088", "127.0.0.1:8340", "127.0.0.1:8350", "127.0.0.1:8351", "127.0.0.1:8353", "127.0.0.1:8355", "127.0.0.1:8354"}
//loopMax := len(svcs)
limitGrouting := 1000
ch := make(chan struct{}, limitGrouting)
defer close(ch)
for _, svc := range svcs {
go DailUnit(ch, svc)
}
wg.Wait()
}
func DailUnit(ch chan struct{}, svc string) {
defer wg.Done()
wg.Add(1)
ch <- struct{}{}
conn, err := net.DialTimeout("tcp", svc, time.Second)
if err != nil {
fmt.Fprintf(os.Stderr, "server %s dail error: %s\n", svc, err.Error())
<-ch
return
}
fmt.Println(svc + "dail ok")
conn.Close()
<-ch
}
- 这里使用的带缓冲的channal,控制协程的数量limitGrouting。
- sync.WaitGroup为了是所有输出都能打印出来。
- DialTimeout的具体时间,可以根据自己的网络情况设置。
- 注意在DailUnit,错误返回前,也要将读取通道,否则带缓冲的通道就会被端口不通的异常场景写满,导致程序阻塞。
- 端口开放场景,最好关闭连接
网友评论