一尘不染

Golang net.Conn并行写入

go

我有多个Goroutines共享一个net.Conn对象。他们可以同时发出写呼叫吗?

我主要关心的是部分完成的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文档中获得很多帮助

因此,问题是:

[编辑]添加了第四个问题

  1. 每次写入套接字时都需要获取锁吗?
  2. 如果是,则无法实现在Write实现中获取锁定的目的。
  3. 在unix实现中,这是否意味着除非err!= nil,否则我无法获得byteSent <len(buf)?(我是说我阅读的代码正确吗?)
  4. Windows上的WSASend是否在Unix实现中实现了等效循环

阅读 559

收藏
2020-07-02

共1个答案

一尘不染

  1. io.Write说,在部分写的情况下,ERR会!=零

  2. 从#1和#2开始,这意味着我在调用net.Conn.Write之前不需要获取锁。

所以我的问题得到了回答。

2020-07-02