上面虽然是协程写文件,但是又很多问题,比如写文件的时候ajax就读文件怎么办,在浏览器里看到很多ajax在pendding,说明ajax请求太快(每2秒),服务端来不及返回,这也一个问题,可以设置每3秒,但是感觉刷新太慢了
我们用channal实现下,go的并发真是太方便了。。。
js部分和No.24一样
main.go
package main
import (
"encoding/json"
"fmt"
"net/http"
"strconv"
"text/template"
"time"
"github.com/shirou/gopsutil/cpu"
"github.com/shirou/gopsutil/disk"
"github.com/shirou/gopsutil/mem"
"github.com/shirou/gopsutil/net"
)
type Sys struct {
Cpuused float64
Memused float64
Memavailable float64
Memtotal float64
Disktotal float64
Diskfree float64
Diskused float64
Netsend float64
Netrecv float64
Netup string
Netdown string
}
func index(w http.ResponseWriter, r *http.Request) {
t, _ := template.ParseFiles("index.html") //找模板
t.Execute(w, nil) //执行模板
}
func main() {
c := make(chan string,2)//设置2个缓存,这样取了一个就会马上放进去一个
go func() {//这里协程死循环,反正主线程不会退出他就不会退出,放了2个,就会阻塞,取了一个马上放一个
s:=Sys{}
for {
s = getstatus()
d, _ := json.Marshal(s)
c <- string(d)
}
}()
http.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.Dir("assets"))))
http.HandleFunc("/ajax", func(writer http.ResponseWriter, request *http.Request) {
writer.Header().Set("Content-type", "application/json;charset=utf-8")
fmt.Fprintln(writer,<-c)
}) //函数也是一种变量
http.HandleFunc("/", index) //函数也是一种变量
http.ListenAndServe(":8082", nil)
}
func toG(i uint64) float64 {
return float64(i) / 1024 / 1024 / 1024
}
func toKB(i uint64) float64 {
return float64(i) / 1024
}
func toMB(i uint64) float64 {
return float64(i) / 1024 / 1024
}
func Decimal(value float64) float64 {
value, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", value), 64)
return value
}
func getNetSpeed() (string, string) {
// 读取所有网卡网速
Net, _ := net.IOCounters(true)
// 定义网速保存变量
var rx, tx uint64
// 循环网络信息
for _, nv := range Net {
// 去除多余信息
if "eth0" == nv.Name {
// 加上网速信息
rx += nv.BytesRecv
tx += nv.BytesSent
}
}
// 暂停一秒
time.Sleep(time.Second)
// 重新读取网络信息
Net, _ = net.IOCounters(true)
// 网络信息保存变量
var rx2, tx2 uint64
// 循环网络信息
for _, nv := range Net {
// 去除多余信息
if "eth0" == nv.Name {
// 加上网速信息
rx2 += nv.BytesRecv
tx2 += nv.BytesSent
}
}
// 两次相减
if toKB(rx2-rx) > 1024 || toKB(tx2-tx) > 1024 {
down:= strconv.FormatFloat(toMB(rx2 - rx),'f',2,64)+"MB/S"
up:= strconv.FormatFloat(toMB(tx2 - tx),'f',2,64)+"MB/S"
return down, up
} else {
down:= strconv.FormatFloat(toKB(rx2 - rx),'f',2,64)+"KB/S"
up:= strconv.FormatFloat(toKB(tx2 - tx),'f',2,64)+"KB/S"
return down, up
}
}
func getstatus() Sys {
s := Sys{}
m, _ := mem.VirtualMemory()
c, _ := cpu.Percent(time.Second, false)
d, _ := disk.Usage("/")
n, _ := net.IOCounters(true)
s.Netsend = Decimal(toG(n[1].BytesSent))
s.Netrecv = Decimal(toG(n[1].BytesRecv))
s.Diskused = Decimal(d.UsedPercent)
s.Diskfree = Decimal(toG(d.Free))
s.Disktotal = Decimal(toG(d.Total))
s.Memused = Decimal(m.UsedPercent)
s.Memtotal = Decimal(toG(m.Total))
s.Memavailable = Decimal(toG(m.Available))
s.Cpuused = Decimal(c[0])
s.Netdown, s.Netup = getNetSpeed()
return s
}