gpt4 book ai didi

windows - panic : net: inconsistent fdMutex

转载 作者:数据小太阳 更新时间:2023-10-29 03:13:25 24 4
gpt4 key购买 nike

我正在尝试在 Windows 10 上的 Go (go1.8.3 windows/amd64) 中实现一个简单的回显服务器,但是在从客户端获得连接(使用 ncat 连接)后的一段时间内,我遇到了这种奇怪的 panic 。可以收发消息,但是不管怎么弄,过一会就死机了,不知道为什么。

代码是

package main

import (
"bufio"
"log"
"net"
)

func echo(conn net.Conn, c chan int) {
c <- 1
reader := bufio.NewReader(conn)
msg, err := reader.ReadBytes('\n')
if err != nil {
log.Printf("error reading from the reader: %v", err)
return
}
conn.Write(msg)
}

func handleConnection(conn net.Conn) {
log.Print("Got connection from: ", conn.RemoteAddr())
conn.Write([]byte("Hello, this is a Go echo server\n"))
c := make(chan int)
for {
go echo(conn, c)
<-c
}
}

func main() {
listener, err := net.Listen("tcp", "127.0.0.1:3000")
if err != nil {
log.Fatalf("couldn't create a tcp server: %v", err)
}
for {
conn, err := listener.Accept()
defer conn.Close()
if err != nil {
log.Printf("couldn't create a connection: %v", err)
return
}
go handleConnection(conn)
}
}

错误是

panic: net: inconsistent fdMutex

goroutine 1048589 [running]:
net.(*fdMutex).rwlock(0xc0420741c0, 0x1, 0x0)
C:/Go/src/net/fd_mutex.go:145 +0x1ab
net.(*netFD).readLock(0xc0420741c0, 0x0, 0x0)
C:/Go/src/net/fd_mutex.go:218 +0x39
net.(*netFD).Read(0xc0420741c0, 0xc365329000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
C:/Go/src/net/fd_windows.go:444 +0x5d
net.(*conn).Read(0xc04205e030, 0xc365329000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
C:/Go/src/net/net.go:181 +0x77
bufio.(*Reader).fill(0xc36532bf08)
C:/Go/src/bufio/bufio.go:97 +0x11e
bufio.(*Reader).ReadSlice(0xc36532bf08, 0xc36532be0a, 0xc36532be00, 0x0, 0x100000000000000, 0x0, 0x1000)
C:/Go/src/bufio/bufio.go:338 +0xc2
bufio.(*Reader).ReadBytes(0xc36532bf08, 0x100a, 0x1000, 0xc365329000, 0x1000, 0x1000, 0x0)
C:/Go/src/bufio/bufio.go:416 +0x6d
main.echo(0x574ce0, 0xc04205e030, 0xc042098d80)
C:/Users/fcfn/goecho/server.go:13 +0x10b
created by main.handleConnection
C:/Users/fcfn/goecho/server.go:27 +0x271

最佳答案

感谢@JimB,我更好地理解了问题的本质。他是这样说的:

The actual error is because you're calling Read from an unbounded number of goroutines. The net package assumes there's no reason to ever have more than 1<<20 concurrent operations on a net.Conn. – JimB


这里有一些错误的代码,这并不能完全解决手头的问题。正如 JimB 所建议的那样,我将其删除,以免误导任何人。

我从 JimB 那里学到了什么:

  1. 你不应该使用 goroutines 除非有必要(echo 函数不应该是 goroutines,因为读取是一个阻塞操作,我们不能对连接做任何事情直到我们了解客户端发送给我们的内容,因此不需要并发;另一方面,handleConnection 在 goroutine 中运行,因为它应该同时处理多个连接。
  2. 错误是宝贵的东西,优雅地处理它们,不要忽视它们。

关于windows - panic : net: inconsistent fdMutex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44678216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com