Golang net.Conn 并行写入

2023-11-25

我有多个 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 文档中获得太多信息

因此问题是:

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

  1. 每次写入套接字时都需要获取锁吗?
  2. 如果是,那么Write实现中获取锁的目的就落空了。
  3. 在unix实现中,这是否意味着我无法获得byteSent
  4. Windows 上的 WSASend 是否实现了 Unix 实现中的等效循环

是的,您可以多次拨打电话net.Conn的并行写入方法。

Part of net.Conn的约定是它可以同时从多个 Goroutine 中使用。这是明确指出的它的文档:

Conn 是通用的面向流的网络连接。

多个 goroutine 可以同时调用 Conn 上的方法。

虽然我不能具体谈论 Windows 实现,但此声明适用于所有平台。由于 Windows 实现中没有循环WSASend调用必须做出保证,而 Unix API 则不然。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Golang net.Conn 并行写入 的相关文章

  • 如何在golang中解析JSON而不需要解组两次

    我有一个 Web 套接字连接 它在 JSON 对象中发送不同类型的消息 并且我想将内容解组到一些已知的结构中 为此 我认为我应该执行以下操作 步骤 1 将 JSON 解组为通用映射 字符串 接口 步骤 2 找到我要找的钥匙 步骤 3 尝试将
  • Golang:带有 JSON 负载的 http.NewRequest POST 返回错误 500

    我正在开发一个 API 库 有一个API端点 POST 当您发出curl命令时 它是 curl H X API TOKEN API TOKEN http interest graph getprismatic com text topic
  • 将 time.Time 转换为字符串

    我正在尝试将数据库中的一些值添加到 string在围棋中 其中一些是时间戳 我收到错误 无法在数组元素中使用 U Created date 类型 time Time 作为类型字符串 我可以转换吗time Time to string typ
  • 如何同时使用 LoadHTMLGlob 和 LoadHTMLFiles

    我想要来自不同子目录的分隔符逻辑模板templates文件夹 下面是我的templates文件夹 templates authentication login gohtml logout gohtml index gohtml profil
  • RSA OAEP、Golang 加密、Java 解密 -BadPaddingException:解密错误

    我正在尝试解密使用 RSA OAEP 在 Golang 中加密的字符串 但出现 BadPaddingException 解密错误 很难弄清楚我错过了什么 这是Golang加密方法 func encryptString rootPEM io
  • select 语句是否保证通道选择的顺序?

    继从这个答案 https stackoverflow com a 25795236 274460 如果一个 goroutine 在两个通道上进行选择 是否保证通道的选择顺序与其发送的顺序相同 我对发送者是单线程的情况特别感兴趣 例如 是否保
  • 与通道相比,sync.WaitGroup 的优势是什么?

    我正在开发一个并发 Go 库 我偶然发现了 goroutine 之间两种不同的同步模式 其结果相似 等待组 https play golang org p ZYPLlcp16TZ package main import fmt sync t
  • Golang 中的确定性 RSA 加密 - 如何在多次加密下为给定消息获得相同的结果

    对于下面的RSA加密代码 每次对同一条消息进行加密时 结果都会不同 我发现这是由于rand Reader in the rsa EncryptOAEP功能使其更加安全doc https pkg go dev crypto rsa Encry
  • Go客户端程序生成大量TIME_WAIT状态的socket

    我有一个 Go 程序 它从多个 goroutine 生成大量 HTTP 请求 运行一段时间后 程序报错 connect cannot allocaterequestedaddress 当检查时netstat 我得到大量 28229 个连接T
  • golang.org 包和标准库之间的区别

    我使用 go 已经有一段时间了 我注意到 Go 标准库 和 golang org x 之间存在重复的包 我的问题是 为什么它们被释放两次 在这两者中 我应该使用哪一个 更新的 规范的等 到目前为止我注意到的一些示例包已发布两次 golang
  • 在复杂的文件夹结构中进行测试

    我正在 golang 中构建一个设计模式存储库 为了运行所有测试 我使用这个 bash 脚本 有用 bin bash go test creational abstract factory go go test creational bui
  • 单值上下文中的多值错误

    我在编译 GO 代码时遇到此错误 multiple value fmt Println in single value context 我正在尝试创建一个函数 该函数接受可变数量的整数并将每个变量打印在一行上 GO package main
  • Facebook服务器端登录、CORS

    我正在实现一个带有 FB 服务器端登录的网站 简化步骤如下 一个简单的按钮触发 JS 脚本 该脚本调用我的后端 APIhttps localhost fblogin function sendFbLoginData get https lo
  • pprof 和 ps 之间的内存使用差异

    我一直在尝试分析用 cobra 构建的 cli 工具的堆使用情况 这pprof工具显示如下 Flat Flat Sum Cum Cum Name Inlined 1 58GB 49 98 49 98 1 58GB 49 98 os Read
  • 测试 gRPC 服务

    我想测试用 Go 编写的 gRPC 服务 我使用的示例是 Hello World 服务器示例grpc go 仓库 https github com grpc grpc go blob master examples helloworld g
  • C 语言中的套接字如何工作?

    我对 C 中的套接字编程有点困惑 You create a socket bind it to an interface and an IP address and get it to listen I found a couple of
  • 运行最新版本时没有“最新”消息?

    我正在尝试使用Sparkle https sparkle project org与 Qt Go 的绑定 https github com therecipe qt app 闪光 m import
  • Golang const unsafe.Sizeof

    不明白为什么我可以做到 const OK uint64 0 const OK int unsafe Sizeof uint64 0 但不是这个 const NOK binary Size uint64 0 它的解释在规格 https gol
  • 从 Golang 调用 C 函数

    我想在 Golang 中编写控制器逻辑并处理 json 和数据库 同时在 C 中使用我的数学处理模型 在我看来 调用 C 函数的开销必须尽可能低 就像设置寄存器 rcx rdx rsi rdi 一样 执行一些操作fastcall 并获取 r
  • 所有可能的 GOOS 价值?

    如果我做对了 GOOS在编译源代码时确定 为了更好地支持多个操作系统 我感兴趣的是GOOS可能 当然 Go 是开源的 所以它可能有无限的可能性 所以我真正想要的是一个 通用列表 已知值为 windows linux darwin or fr

随机推荐

  • 我们如何计算处理时间?

    我创建了一个PopupPanel并已展示出来 我想在一分钟过去后隐藏它 在那一分钟内 该过程不应停止或暂停 我怎样才能实现这种行为 GWT 有自己的实现Timer 这是一个非常小的例子 public void onModuleLoad fi
  • 使用 Node.js 管理 sdk 创建令牌时的 Firebase REST 身份验证

    我知道这个问题在这里被问了很多 但我似乎仍然找不到可以解决我的问题的确切答案 我希望通过添加 access token 参数使用 REST 调用访问 Firebase access token 是使用 Node js Admin SDK 创
  • MICE 不会估算某些列,但也不会给出错误

    我知道以前曾问过类似的问题 例如 1 2 3 但我还是不明白为什么mice即使我尝试像示例中那样的无条件均值 也无法预测缺失值1 我的稀疏矩阵是 k1 k3 k5 k6 k7 k8 k11 k12 k13 k14 k15 1 NA NA N
  • 将单词(字符串)转换为 Int

    我确信这已经被做过一百次了 但我希望有一种非常简单的方法来完成这个任务 我想将单词更改为整数 就像下面的例子 One 1 Two 2 Three 3 所以基本上 如果我有字符串 One 它会转换为 1 即使我可以返回字符串 1 我也可以将其
  • Java:如何查看代码的哪些部分运行最多? (分析)

    我正在用 Java 编写一个简单的跳棋游戏 当我将鼠标悬停在主板上时 我的处理器性能提升至 50 核心上为 100 我想找出我的代码的哪一部分 假设是我的错 在此期间正在执行 我尝试过调试 但在这种情况下逐步调试效果不太好 有没有什么工具可
  • 获取当前正在运行的活动的实例?

    我想做的是将运动事件分派给当前正在运行的活动 我从这段代码中获取了当前活动的 ComponentName ActivityManager am ActivityManager getSystemService ACTIVITY SERVIC
  • 排除类型的重载的类型注释(某些类型与其他类型)

    我正在尝试使用 overload传达调用函数的不同方式 但是通过简单的代码可以轻松传达什么else声明在类型注释中是不可能的 如果没有 else MyPy 正确地 会抱怨重载版本不匹配 例如 请参见下面的代码片段 error Overloa
  • 错误 X3000:着色器文件中存在非法字符

    我粘贴了一行着色器代码 现在我的项目无法工作 我删除了受污染的代码行 我已经按照 VS Notepad 和 Notepad 的建议从头开始多次重写着色器Unity 论坛 我在 Notepad 中使用了十六进制编辑器视图来排除前两个字节不是0
  • CA2000 将对象引用传递给 C# 中的基本构造函数

    当我通过 Visual Studio 的代码分析实用程序运行一些代码时 我收到一条警告 我不确定如何解决 也许这里有人遇到过类似的问题 解决了它 并愿意分享他们的见解 我正在编写一个在 DataGridView 控件中使用的自定义绘制单元格
  • 为什么VS中的Debug模式比Release慢?

    我已经用谷歌搜索过这个问题 通常答案相当复杂 而且我并不真正理解所有的行话 有没有简单的解释为什么调试模式这么慢 为什么不总是在发布版本中运行呢 调试模式已关闭所有优化 以确保连接的调试器按预期工作 一个版本将会开启很多优化 比这更简单的我
  • 清除 Java 缓存

    我想知道如何使用 Java 代码或 CMD 行代码清除 Java 缓存 这应该在 Windows 7 及以上版本的 Microsoft Windows 计算机上完成 这应该在多台计算机上完成 因此文件路径会有所不同 该应用程序使用 Java
  • 查询GAE数据存储时如何修复索引错误?

    当我尝试对按日期排序的数据存储运行查询时 出现以下错误 NeedIndexError no matching index found The suggested index for this query is kind Message pr
  • 根据 bin 大小将列表分为多个列表

    我有一个包含超过 100 000 个值的列表 我需要根据特定的 bin 宽度 例如 0 1 将列表划分为多个较小的列表 谁能帮我写一个Python程序来做到这一点 我的清单看起来像这样 0 234 0 04325 0 43134 0 315
  • .R 脚本文件位于 PC 上的哪里?

    我想找到用于 R 中计算的脚本 R 文件的位置 我知道通过输入对象函数 我将获得正在运行的代码 然后我可以复制 编辑并将其另存为新的脚本文件并使用它 要求查找 foo R 文件的原因是 好奇心 了解数值计算中使用的算法是什么 更直接的是 函
  • C++ Visual Studio 编译错误

    我收到以下编译错误 致命错误 C1189 error 错误 使用 C 运行时库内部头文件 我对此完全不知道 谁能解释一下吗 完整的错误 C Program Files Microsoft Visual Studio 8 VC ce incl
  • 使用一次性使用令牌将 Auth0 实现到 chrome 扩展中

    我正在制作一个 chrome 扩展程序 我想为我的 chrome 扩展程序创建一个安全方法 以阻止它在没有我参与的情况下被共享 我有一个想法在某个地方生成一个令牌 通常是一些后端 也许是网站的服务器 该服务器获取我用 worpress 构建
  • 跨不同类加载器覆盖默认访问器方法会破坏多态性

    我在尝试使用以下方法重写方法时遇到了奇怪的行为默认访问器 ex void run 根据Java规范 如果类属于同一个包 则类可以使用或覆盖基类的默认成员 当所有类从同一个类加载器加载时 一切正常 但是如果我尝试从中加载子类separate类
  • Windows 上缺少“magic”库的文件

    我需要获取 Windows 上某些文件的 mime 类型 所以我已经安装了python magic 在 32 位 python 2 7 3 上 这取决于unixmagic图书馆 作者指示获取regex2 dll zlib1 dll and
  • 如何获取 xsd 验证失败的无效 xml 文件的元素

    我目前正在使用 XSD 来验证我的 xml 这部分工作正常 我的问题是我想获取无效的标签 值的元素 InputSource is new InputSource is setCharacterStream new StringReader
  • Golang net.Conn 并行写入

    我有多个 Goroutine 共享一个 net Conn 对象 他们可以同时发出 Write 调用吗 我主要关心的是已部分完成的 Write 调用 假设我打算写 100 个字节 但只发送了 30 个字节 所以我需要再发送 70 个字节 为此