我有多个 Goroutine 共享一个 net.Conn 对象。他们可以同时发出 Write 调用吗?
我主要关心的是已部分完成的 Write 调用。假设我打算写 100 个字节,但只发送了 30 个字节,所以我需要再发送 70 个字节。为此,我通常会编写一个循环:
count := 0
for count < len(buf) {
byteSent, err := conn.Write(buf[count:])
//check error
count += byteSent
}
但我看到 Go 实现了这个循环net.Conn.Write第 318 行,它是通过锁定来实现的。
然而,关于Windows除了调用 WSASend 之外,没有这样的循环。我不知道 WSASend 的行为方式,并且无法从 MSDN 文档中获得太多信息
因此问题是:
[编辑]添加了第四个问题
- 每次写入套接字时都需要获取锁吗?
- 如果是,那么Write实现中获取锁的目的就落空了。
- 在unix实现中,这是否意味着我无法获得byteSent
- Windows 上的 WSASend 是否实现了 Unix 实现中的等效循环
是的,您可以多次拨打电话net.Conn
的并行写入方法。
Part of net.Conn
的约定是它可以同时从多个 Goroutine 中使用。这是明确指出的它的文档:
Conn 是通用的面向流的网络连接。
多个 goroutine 可以同时调用 Conn 上的方法。
虽然我不能具体谈论 Windows 实现,但此声明适用于所有平台。由于 Windows 实现中没有循环WSASend
调用必须做出保证,而 Unix API 则不然。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)