gpt4 book ai didi

go - io.copy在goroutine中以防止阻塞

转载 作者:行者123 更新时间:2023-12-01 21:17:32 25 4
gpt4 key购买 nike

我正在读《 Black Hat Go》这本书。我遇到了一个简单的TCP代理的例子。它基本上只是转发请求,然后发回回复。代理代码的要旨如下所示(已修改):

func handle(src net.Conn) {
dst, err := net.Dial("tcp", "example.com:80")
if err != nil {
log.Fatalln("Unable to connect to remote")
}
defer dst.Close()

// Run in goroutine to prevent io.Copy from blocking
go func() {
if _, err := io.Copy(dst, src); err != nil {
log.Fatalln("Something wrong src -> dst")
}
}()

if _, err := io.Copy(src, dst); err != nil {
log.Fatalln("Something wrong dst -> src")
}
}
我不理解的部分是注释“在goroutine中运行以防止io.Copy被阻止”。我已经在带有goroutine的情况下运行了它,也没有将它包装在goroutine中,并且它仅与goroutine一起工作,但是我不明白为什么。我们不能为请求运行一个阻塞的 io.Copy,然后为响应运行另一个?我想我在理解如何在goroutine中运行第一个 io.Copy时如何保证顺序方面遇到困难。

最佳答案

在处理TCP流时,必须处理从src到dest以及从dest到src两种方式的通信。您可以执行两次复制操作。但是,复制将一直阻塞,直到收到错误或EOF(即套接字关闭),因此您必须将这些复制操作中的至少一个放入goroutine。写入方式是,一个复制操作将从一个套接字读取并向另一个套接字写入,而另一个复制操作将执行相反的操作,直到出现错误或EOF。收到错误或EOF时,两个复制操作都将停止。

关于go - io.copy在goroutine中以防止阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62522276/

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