go - 这是 goroutine 开销的一个更好的代码

标签 go overhead goroutine

我想让 Reader.Read 与 channel 通信并发。 所以我做了两种运行方式

1:

type ReturnRead struct {
    n   int
    err error
}

type ReadGoSt struct {
    Returnc <-chan ReturnRead
    Nextc chan struct{}
}

func (st *ReadGoSt) Close() {
    defer func() {
        recover()
    }()
    close(st.Next)
}

func ReadGo(r io.Reader, b []byte) *ReadGoSt {
    returnc := make(chan ReturnRead)
    nextc := make(chan bool)

    go func() {
        for range nextc {
            n, err := r.Read(b)
            returnc <- ReturnRead{n, err}
            if err != nil {
                return
            }
        }
    }()

    return &ReadGoSt{returnc, nextc}
}

2:

func ReadGo(r io.Reader, b []byte) <-chan ReturnRead {
    returnc := make(chan ReturnRead)
    go func() {
        n, err := r.Read(b)
        returnc <- ReturnRead{n, err}
    }()
    return returnc
}

我认为代码 2 产生了太多开销

哪个代码更好? 1? 2?

最佳答案

代码 1 更好,而且可能更快。代码 2 只会读取一次。但我认为这两种解决方案都不是最好的。你应该循环读取并只发回读取的字节。

类似于:http://play.golang.org/p/zRPXOtdgWD

关于go - 这是 goroutine 开销的一个更好的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27865277/

相关文章:

go - 在 Go 中的多个位置收听一个 channel

go - 从多个 goroutine 添加到 WaitGroup 是否安全?

go - 无法从 ssh 获取 stderr

c++ - MPI 和标准输入开销?

c++ - 空 vector 的开销成本是多少?

Go 并发模式——这会留下挂起的 goroutines 吗?

go - Golang gorilla WebSocket包如何保证并发

使用 Delve 在 VSCode 上调试 GO

JavaMelody 开销而不是 JMX

go - 在 Go 中定期调用 N 个并发函数的最佳方法是什么?