似乎不可能通过通道与执行文件操作的 goroutine 进行双向通信,除非您阻止文件操作上的通道通信。我怎样才能解决这强加的限制?
表达这个问题的另一种方式......
如果我有一个类似于以下在 goroutine 中运行的循环,我如何告诉它关闭连接并退出而不阻塞下一次读取?
func readLines(response *http.Response, outgoing chan string) error {
defer response.Body.Close()
reader := bufio.NewReader(response.Body)
for {
line, err := reader.ReadString('\n')
if err != nil {
return err
}
outgoing <- line
}
}
它不可能从告诉它何时关闭的通道读取,因为它阻塞了网络读取(在我的情况下,这可能需要几个小时)。
简单地从 goroutine 外部调用 Close() 似乎并不安全,因为 Read/Close 方法似乎不是完全线程安全的。
我可以简单地对在例程内部/外部使用的 response.Body 的引用加锁,但会导致外部代码阻塞,直到挂起的读取完成,我特别希望能够中断正在进行的读取。
慕斯709654
相关分类