欢迎光临
我们一直在努力

go语言学习例子No.26–页面实时获取系统信息3

上面虽然是协程写文件,但是又很多问题,比如写文件的时候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
}
 收藏 (0) 打赏

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

未经允许不得转载:家里蹲的狐狸 » go语言学习例子No.26–页面实时获取系统信息3

分享到: 生成海报
avatar

热门文章

评论 抢沙发

  • QQ号
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

登录

忘记密码 ?

切换登录

注册

我们将发送一封验证邮件至你的邮箱, 请正确填写以完成账号注册和激活