校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > golang高并發限流操作 ping / telnet

golang高并發限流操作 ping / telnet

熱門標簽:寧波語音外呼系統公司 鄭州智能語音電銷機器人價格 不封卡外呼系統 地圖標注免費定制店 宿遷便宜外呼系統代理商 湛江crm外呼系統排名 上海極信防封電銷卡價格 重慶慶云企業400電話到哪申請 仙桃400電話辦理

需求

當需要同時ping/telnet多個ip時,可以通過引入ping包/telnet包實現,也可以通過go調用cmd命令實現,不過后者調用效率較差,所以這里選擇ping包和telnet包

還有就是高并發的問題,可以通過shell腳本或者go實現高并發,所以我選擇的用go自帶的協程實現,但是如果要同時處理1000+個ip,考慮到機器的性能,需要ratelimit控制開辟的go協程數量,這里主要寫一下我的建議和淌過的坑

ping

參考鏈接: https://github.com/sparrc/go-ping

import "github.com/sparrc/go-ping"
import "time"
func (p *Ping) doPing(timeout time.Duration, count int, ip string) (err error) {
 pinger, cmdErr := ping.NewPinger(ip)
 if cmdErr != nil {
  glog.Error("Failed to ping " + p.ipAddr)
  err = cmdErr
  return
 }
 pinger.Count = count
 pinger.Interval = time.Second
 pinger.Timeout = timeout
 // true的話,代表是標準的icmp包,false代表可以丟包類似udp
 pinger.SetPrivileged(false)
 // 執行
 pinger.Run() 
 // 獲取ping后的返回信息
 stats := pinger.Statistics() 
 //延遲
 latency = float64(stats.AvgRtt) 
 // 標準的往返總時間 
 jitter = float64(stats.StdDevRtt) 
 //丟包率 
 packetLoss = stats.PacketLoss 
 return
}

注意: pinger.Run() 這里執行的時候是阻塞的,如果并發量大的時候,程序會卡死在這里,所以當有高并發的需求時建議如下處理:

go pinger.Run()

time.Sleep(timeout)

telnet

package main
import (
 "github.com/reiver/go-telnet"
)
func doTelnet(ip string, port int) {
 var caller telnet.Caller = telnet.StandardCaller
 address := ip + ":"+ strconv.Itoa(port)
 // DialToAndCall 檢查連通性并且調用
 telnet.DialToAndCall(address, caller)
 }
}

bug出現報錯:

lookup tcp/: nodename nor servname provided, or not known

解決:

修改string(port)為strconv.Itoa(port)

DialToAndCall這種方式telnet無法設置超時時間,默認的超時時間有1分鐘,所以使用DialTimeout這個方式實現telnet

import "net"
func doTelnet(ip string, ports []string) map[string]string {
 // 檢查 emqx 1883, 8083, 8080, 18083 端口
 results := make(map[string]string)
 for _, port := range ports {
 address := net.JoinHostPort(ip, port)
 // 3 秒超時
 conn, err := net.DialTimeout("tcp", address, 3*time.Second)
 if err != nil {
 results[port] = "failed"
 } else {
 if conn != nil {
 results[port] = "success"
 _ = conn.Close()
 } else {
 results[port] = "failed"
 }
 }
 }
 return results
}

shell高并發

本質就是讀取ip.txt文件里的ip,然后調用ping方法,實現高并發也是借助遍歷所有的ip然后同一交給操作系統去處理高并發

while read ip
do
 {
 doPing(ip)
 } 
done  ip.txt

go高并發限速

import (
 "context"
 "fmt"
 "log"
 "time"
 "sync"
 "golang.org/x/time/rate"
)
func Limit(ips []string)([]string, []string, error) {
 //第一個參數是每秒鐘最大的并發數,第二個參數是桶的容量,第一次的時候每秒可執行的數量就是桶的容量,建議這兩個值都寫成一樣的
 r := rate.NewLimiter(10, 10)
 ctx := context.Background()
 
 wg := sync.WaitGroup{}
 wg.Add(len(ips))
 
 lock := sync.Mutex{}
 var success []string
 var fail []string
 
 defer wg.Done()
 for _,ip:=range ips{
 //每次消耗2個,放入一個,消耗完了還會放進去,如果初始是5個,所以這段代碼再執行到第4次的時候筒里面就空了,如果當前不夠取兩個了,本次就不取,再放一個進去,然后返回false
 err := r.WaitN(ctx, 2)
 if err != nil {
  log.Fatal(err)
 }
 go func(ip string) {
 defer func() {
 wg.Done()
 }()
 err := doPing(time.Second, 2, ip)
 lock.Lock()
 defer lock.Unlock()
 if err != nil {
 fail = append(fail, ip)
 return
 } else {
 success = append(success, ip)
 }
 }(ip)
 }
 // wait等待所有go協程結束
 wg.wait()
 return success,fail,nil
}
func main() {
 ips := [2]string{"192.168.1.1","192.168.1.2"}
 success,fail,err := Limit(ips)
 if err != nil {
 fmt.Printf("ping error")
 }
}

這里注意一個并發實現的坑,在for循環里使用goroutine時要把遍歷的參數傳進去才能保證每個遍歷的參數都被執行,否則只能執行一次

(拓展)管道、死鎖

先看個例子:

func main() {
 go print() // 啟動一個goroutine
 print()
}
func print() {
fmt.Println("*******************")
}

輸出結果:

*******************

沒錯,只有一行,因為當go開辟一個協程想去執行print方法時,主函數已經執行完print并打印出來,所以goroutine還沒有機會執行程序就已經結束了,解決這個問題可是在主函數里加time.sleep讓主函數等待goroutine執行完,也可以使用WaitGroup.wait等待goroutine執行完,還有一種就是信道

信道分無緩沖信道和緩沖信道

無緩沖信道

無緩沖信道也就是定義長度為0的信道,存入一個數據,從無緩沖信道取數據,若信道中無數據,就會阻塞,還可能引發死鎖,同樣數據進入無緩沖信道, 如果沒有其他goroutine來拿走這個數據,也會阻塞,記住無緩沖數據并不存儲數據

func main() {
 var channel chan string = make(chan string)
 go func(message string) {
 channel- message // 存消息
 }("Ping!")
 fmt.Println(-messages) // 取消息
}

緩存信道

顧名思義,緩存信道可以存儲數據,goroutine之間不會發生阻塞,for循環讀取信道中的數據時,一定要判斷當管道中不存在數據時的情況,否則會發生死鎖,看個例子

channel := make(chan int, 3)
channel - 1
channel - 2
channel - 3
// 顯式關閉信道
close(channel)
for v := range channel {
 fmt.Println(v)
 // 如果現有數據量為0,跳出循環,與顯式關閉隧道效果一樣,選一個即可
 if len(ch) = 0 { 
 break
 }
}

但是這里有個問題,信道中數據是可以隨時存入的,所以我們遍歷的時候無法確定目前的個數就是信道的總個數,所以推薦使用select監聽信道

// 創建一個計時信道
timeout := time.After(1 * time.Second) 
// 監聽3個信道的數據
select {
 case v1 := - c1: fmt.Printf("received %d from c1", v1)
 case v2 := - c2: fmt.Printf("received %d from c2", v2)
 case v3 := - c3: fmt.Printf("received %d from c3", v3)
 case - timeout: 
 is_timeout = true // 超時
 break
 }
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Java進階之高并發核心Selector詳解
  • java的多線程高并發詳解
  • MySQL高并發生成唯一訂單號的方法實現
  • PHP解決高并發的優化方案實例
  • Redis處理高并發機制原理及實例解析
  • C#請求唯一性校驗支持高并發的實現方法
  • Tomcat+Mysql高并發配置優化講解
  • Redis高并發問題的解決方法
  • 如何理解軟件系統的高并發

標簽:物業服務 電子產品 海南 安康 青海 西雙版納 儋州 遼寧

巨人網絡通訊聲明:本文標題《golang高并發限流操作 ping / telnet》,本文關鍵詞  golang,高并發,高,并發,限流,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang高并發限流操作 ping / telnet》相關的同類信息!
  • 本頁收集關于golang高并發限流操作 ping / telnet的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    91免费观看国产| 艳妇臀荡乳欲伦亚洲一区| 91精品国产综合久久香蕉的特点 | 91日韩在线专区| 国产精品亚洲第一| 久久99精品视频| 久久爱www久久做| 国产麻豆91精品| 国产成人8x视频一区二区| 国产在线精品免费av| 麻豆久久久久久| 国产最新精品免费| 国产成人精品亚洲777人妖| 国产一二精品视频| 成人高清视频在线观看| 91网站在线播放| 欧洲亚洲精品在线| 555www色欧美视频| 欧美精品一区二| 日本一区二区三区在线不卡| 中文字幕一区二区三区四区 | 亚洲综合激情另类小说区| 亚洲女厕所小便bbb| 亚洲一区视频在线观看视频| 午夜精品成人在线视频| 久久99精品网久久| 成人av高清在线| 精品视频一区三区九区| 日韩欧美精品在线| 国产精品久久久久aaaa樱花 | 国产在线精品一区二区夜色| 国产成人精品影院| 欧美日韩一区二区在线视频| 精品剧情在线观看| 亚洲人成亚洲人成在线观看图片| 亚洲精品ww久久久久久p站| 三级一区在线视频先锋| 国产成人精品影院| 91精品国产综合久久精品麻豆| 久久理论电影网| 亚洲综合视频网| 韩国视频一区二区| 欧美日韩免费视频| 国产精品美女视频| 日韩精品91亚洲二区在线观看| 粉嫩13p一区二区三区| 在线一区二区三区四区五区| 精品国产一区二区三区久久久蜜月| 国产精品国产三级国产有无不卡| 日韩影院免费视频| 一本久道中文字幕精品亚洲嫩| 精品久久久久久久久久久久久久久 | 久久精品欧美一区二区三区不卡 | 欧美日韩国产中文| 国产一区二区三区不卡在线观看| 国产精品一区2区| 欧美日韩精品一区二区三区| 久久久精品2019中文字幕之3| 亚洲一区二区三区四区五区中文| 国内精品视频666| 69堂亚洲精品首页| 一区二区三区中文字幕| 国产夫妻精品视频| 日韩欧美不卡一区| 亚洲成a人v欧美综合天堂下载| 丁香婷婷综合色啪| 国产亚洲欧美色| 久久99久久99| 日韩一区二区在线观看视频| 亚洲国产欧美在线| 91小视频在线| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲无人区一区| av电影在线观看不卡 | 亚洲电影第三页| 成人综合激情网| 久久久久久久久久久电影| 成人在线视频首页| 精品日韩欧美在线| 精品亚洲成av人在线观看| 欧美一区二区三区视频| 三级久久三级久久| 欧美成人a在线| 国内外成人在线| 欧美va在线播放| 日本va欧美va精品发布| 欧美一区二区在线播放| 久久99国产精品免费| 久久综合精品国产一区二区三区 | 亚洲在线视频免费观看| 91蝌蚪porny九色| 一区2区3区在线看| 91麻豆精品国产自产在线观看一区 | 337p粉嫩大胆噜噜噜噜噜91av| 成人精品免费看| 国产亚洲va综合人人澡精品| 高清不卡一区二区在线| 国产精品久久久久永久免费观看 | 亚洲一区二区在线免费观看视频| 99re成人精品视频| 亚洲成a人片在线不卡一二三区 | 2024国产精品| 国产不卡视频一区二区三区| 国产精品成人免费在线| 欧美影院一区二区三区| 精品一区二区成人精品| 国产精品成人免费| 制服丝袜亚洲播放| 国产精品亚洲成人| 亚洲乱码国产乱码精品精可以看| 欧美丰满嫩嫩电影| www.在线成人| 日本中文字幕一区二区视频 | 蜜桃视频第一区免费观看| 337p日本欧洲亚洲大胆色噜噜| 成人动漫一区二区在线| 午夜视频在线观看一区二区三区| 久久伊99综合婷婷久久伊| 色av一区二区| 国产精品综合二区| 亚洲精品乱码久久久久久久久| 日韩精品一区二区三区视频| 成人av电影免费在线播放| 日韩国产一二三区| 亚洲男同性视频| 91精品国产综合久久久蜜臀图片| 99免费精品在线观看| 精品一区二区三区影院在线午夜| 亚洲欧洲另类国产综合| 精品三级在线观看| 欧美日韩综合不卡| 99v久久综合狠狠综合久久| 韩国欧美国产一区| 亚欧色一区w666天堂| 国产精品久久午夜| 国产欧美一区二区精品性色| 91精品国产综合久久久久久漫画| 色婷婷久久99综合精品jk白丝| 97精品视频在线观看自产线路二| 日本系列欧美系列| 亚洲一区二区影院| 亚洲综合视频网| 亚洲精品成a人| 亚洲人xxxx| 日韩一区欧美小说| 最新中文字幕一区二区三区| 久久久一区二区| 2020国产精品自拍| 91精品国产手机| 欧美一区二区在线播放| 欧美一区二区三区视频免费播放 | 麻豆传媒一区二区三区| 亚洲一区二区三区不卡国产欧美| 国产精品网友自拍| 国产午夜精品在线观看| 久久综合色之久久综合| 精品捆绑美女sm三区| 51久久夜色精品国产麻豆| 欧美精三区欧美精三区| 欧美日韩日日摸| 正在播放亚洲一区| 91精品国产全国免费观看| 欧美日本在线一区| 91网站在线播放| 欧美日韩精品一区二区三区四区 | 久久综合九色综合欧美亚洲| 久久老女人爱爱| 久久久久久电影| 中文字幕免费在线观看视频一区| 日本一区二区三区dvd视频在线| 久久久国产一区二区三区四区小说 | 国产乱码精品一区二区三区五月婷 | 一区二区激情小说| 五月天久久比比资源色| 日本不卡视频在线| 国产精品综合一区二区| 成人黄色片在线观看| 欧美性大战久久久久久久| 91精品国产91热久久久做人人| 精品黑人一区二区三区久久| 久久久国产精华| 一二三四社区欧美黄| 免费欧美在线视频| 成人免费观看视频| 欧美嫩在线观看| 日本一区二区三区高清不卡| 艳妇臀荡乳欲伦亚洲一区| 美女一区二区三区| www.在线成人| 日韩欧美国产综合一区| 中文字幕第一区| 亚洲午夜一二三区视频| 久久精品国产免费| av中文字幕不卡| 91精品国产91久久久久久最新毛片| 欧洲一区二区三区在线| 国产不卡在线一区| 欧美日韩色一区| 亚洲国产精品成人综合色在线婷婷 | 精品成人一区二区三区四区|