我有多个Goroutines共享一个net.Conn对象。他们可以同时发出写入呼叫吗?
我主要担心的是部分完成的写调用。假设我打算写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文档中获得太多收益
因此问题是:
[edit]添加了第4个问题
答案 0 :(得分:5)
是的,您可以并行调用net.Conn
的写入方法。
net.Conn
合同的一部分是它可以同时从多个Goroutines中使用。这在its documentation中明确提到:
Conn是一种通用的面向流的网络连接。
多个goroutine可以同时调用Conn上的方法。
虽然我不能特别谈到Windows实现,但这种说法适用于所有平台。由于Windows实现中没有循环,因此WSASend
调用必须保证Unix API不会。
答案 1 :(得分:0)