1 回答

TA贡献1891条经验 获得超3个赞
这似乎是一个同步问题。这不是网络服务器,而是 exec.Command 的工作方式以及缓冲区的共享方式。
这个程序可能有助于解释。它每秒运行 ping 并读取缓冲区,每次都尝试重置缓冲区。Ping 每秒都在写入缓冲区。
func main() {
cmd := exec.Command("ping", "google.com")
var buf bytes.Buffer
cmd.Stdout = &buf
err := cmd.Start()
if err != nil {
log.Fatal(err)
}
for i := 0; i < 3; i++ {
time.Sleep(1 * time.Second)
log.Println(buf.String())
buf.Reset()
}
cmd.Process.Kill()
}
但是每次输出都是累加的,就好像对 buf.Reset() 的调用被忽略了一样:
$ go run main.go
2020/01/28 22:05:25 PING google.com(syd09s13-in-x0e.1e100.net (2404:6800:4006:807::200e)) 56 data bytes
64 bytes from syd09s13-in-x0e.1e100.net (2404:6800:4006:807::200e): icmp_seq=1 ttl=50 time=50.3 ms
2020/01/28 22:05:26 PING google.com(syd09s13-in-x0e.1e100.net (2404:6800:4006:807::200e)) 56 data bytes
64 bytes from syd09s13-in-x0e.1e100.net (2404:6800:4006:807::200e): icmp_seq=1 ttl=50 time=50.3 ms
64 bytes from syd09s13-in-x0e.1e100.net (2404:6800:4006:807::200e): icmp_seq=2 ttl=50 time=52.0 ms
2020/01/28 22:05:27 PING google.com(syd09s13-in-x0e.1e100.net (2404:6800:4006:807::200e)) 56 data bytes
64 bytes from syd09s13-in-x0e.1e100.net (2404:6800:4006:807::200e): icmp_seq=1 ttl=50 time=50.3 ms
64 bytes from syd09s13-in-x0e.1e100.net (2404:6800:4006:807::200e): icmp_seq=2 ttl=50 time=52.0 ms
64 bytes from syd09s13-in-x0e.1e100.net (2404:6800:4006:807::200e): icmp_seq=3 ttl=50 time=57.1 ms
bytes.Buffer 可以替换为同步缓冲区,其中写入和读取由互斥锁保护。这有点简单,但例如:
type SyncBuf struct {
mu sync.Mutex
buf bytes.Buffer
}
func (s *SyncBuf) Write(p []byte) (int, error) {
s.mu.Lock()
defer s.mu.Unlock()
return s.buf.Write(p)
}
func (s *SyncBuf) Reset() {
s.mu.Lock()
defer s.mu.Unlock()
s.buf.Reset()
}
func (s *SyncBuf) String() string {
s.mu.Lock()
defer s.mu.Unlock()
return s.buf.String()
}
当缓冲区被替换时,输出行为符合预期,尊重 Reset() 调用:
$ go run main.go
2020/01/28 22:07:03 PING google.com(syd09s13-in-x0e.1e100.net (2404:6800:4006:807::200e)) 56 data bytes
64 bytes from syd09s13-in-x0e.1e100.net (2404:6800:4006:807::200e): icmp_seq=1 ttl=50 time=50.4 ms
2020/01/28 22:07:04 64 bytes from syd09s13-in-x0e.1e100.net (2404:6800:4006:807::200e): icmp_seq=2 ttl=50 time=51.8 ms
2020/01/28 22:07:05 64 bytes from syd09s13-in-x0e.1e100.net (2404:6800:4006:807::200e): icmp_seq=3 ttl=50 time=50.8 ms
免责声明:这是作为插图发布的,它可能不是解决您问题的好方法。
- 1 回答
- 0 关注
- 194 浏览
添加回答
举报