我正在尝试制作一个能够同时 ping 多个地址的 GO 应用程序。我已经遵循了多个教程和代码部分,现在我已经在这部分停留了一段时间。
我尝试过使用频道,但这并没有让我更进一步。这是我第一次使用例程,而且我是 Go 新手。
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/tatsushid/go-fastping"
"log"
"net"
"os"
"sync"
"time"
)
var (
id int
ip string
)
var rttr time.Duration
var db *sql.DB
var wg sync.WaitGroup
func main() {
for {
queries := []string{
"SELECT id, ip FROM hosts where id < 50",
"SELECT id, ip FROM hosts where id >= 50",
}
for _, query := range queries {
wg.Add(1)
go doPing(query)
}
wg.Wait()
}
}
func doPing(query string) {
defer wg.Done()
fmt.Println("Worker started!")
time.Sleep(time.Second)
db, err := sql.Open("mysql", "Your credentials :) ")
if err != nil {
panic(err)
}
db.SetConnMaxLifetime(time.Minute * 15)
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(10)
rows, err := db.Query(query)
fmt.Println("QUERY:")
fmt.Println(query)
fmt.Println("--------")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
err := rows.Scan(&id, &ip)
if err != nil {
log.Fatal(err)
}
p := fastping.NewPinger()
ra, err := net.ResolveIPAddr("ip4:icmp", ip)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
p.AddIPAddr(ra)
p.OnRecv = func(addr *net.IPAddr, rtt time.Duration) {
fmt.Printf("IP Addr: %s receive, RTT: %v\n", addr.String(), rtt)
fmt.Println(id)
rttr = rtt
}
p.OnIdle = func() {
*irrelevant database stuff, ignore*
}
err = p.Run()
if err != nil {
fmt.Println(err)
}
time.Sleep(time.Second)
}
}
我也是提问的新手,所以如果你需要什么,lmk :)