[go]增加并发控制的并发ping
发布时间:2020-12-16 18:58:16 所属栏目:大数据 来源:网络整理
导读:参照anyevent/coro版的ping功能实现. golang没有方便的pop/shift语法,只能自己按数组进行计数 /*gorouting版本的并行ping */package mainimport ("ping""fmt""time""strconv")var fin chan string; //用于实现joinall//go没有pop/shift操作,只能自己计数var
参照anyevent/coro版的ping功能实现. golang没有方便的pop/shift语法,只能自己按数组进行计数 /*gorouting版本的并行ping */ package main import ( "ping" "fmt" "time" "strconv" ) var fin chan string; //用于实现joinall //go没有pop/shift操作,只能自己计数 var cur int /*定义协程 ping单个目标 输入:目标ip/域名 输出:结果,时延 */ func doit(){ if cur >= len(iplist){ return } ip:=iplist[cur] cur++ go pingr(ip,1000) } func pingr(host string,timeout int){ t1:=time.Now().UnixNano() alive,err:=ping.Ping(host,timeout) //alive,err:=true,0 t2:=time.Now().UnixNano() fmt.Println(host,alive,(t2-t1)/1000000,err); fin <- host doit() } //定义iplist var iplist [253]string func main() { //创建队列 fin = make(chan string) //数组赋值 for i := 0; i < len(iplist); i++ { iplist[i]="192.168.99."+strconv.Itoa(i+1) } //控制并发 cocurrent := 100 cur =0 for j := 0; j < cocurrent; j++ { doit() } //等待结束 for i := 0; i < len(iplist); i++ { <-fin //fmt.Println(ip,"joined") } }
golang的协程和perl/erlang是有些不同的,它的go程是可以并发调度的 所以这段代码里面cur++操作不是线程安全的,实际应用应该封装成chan或者使用锁 这个是golang为了利用到多核,而在设计理念上的不同。 优点是协程也可以用到多核,不需要另起多进程。 缺点是协程之间存在并发竞争了,需要注意共享冲突。 说不好这样是好还是不好,但是需要注意。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |