当前位置: 首页 > 面试题库 >

Golang net.Conn并行写入

景唯
2023-03-14
问题内容

我有多个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实现中实现了等效循环

问题答案:
  1. 该io.Write说,在部分写的情况下,ERR会!=零

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

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



 类似资料:
  • 参考 testing tutorial,testing tools reference和advanced testing topics。 本文档分为2个主要单元。首先,我们讲解如何利用Django编写测试.之后,我们讲解如何运行测试。 编写测试 Django的单元测试使用的是Python标准库:unittest。该模块是采用基于类的测试。 unittest2 从 1.7 版本开始不推荐使用 Pyt

  • 是否有一套我应该遵循的标准规则来确保为Spark编写的Scala代码会并行运行? 我发现自己正在编写火花代码,其中包括对和等函数的调用,我认为这些函数将并行/分布式运行。但是我真的不知道如何测试这些函数是否是并行/分布式运行的。是否有专门针对Spark的文本或可应用于Spark的通用文本来解释这一点?

  • 我得到一个包含100行数据的表。(Sqlite3和Linux) 这些行上的每个都由多个进程更新。既然同一行不能修改两次(一个进程“拥有”一行并且只有一行),你认为我真的需要使用事务吗?

  • 我想我在并发s3写入方面有问题。两个(或更多)进程同时将几乎相同的内容写入相同的s3位置。我想确定控制这种情况的并发规则。 按照设计,除了一个进程外,所有进程都会在写入s3时被杀死。(我说过,他们写的内容“几乎”相同,因为除了一个进程之外,所有进程都被杀死了。如果所有进程都被允许生存,他们最终会写相同的内容。) 我的理论是,被终止的进程在s3上留下了一个不完整的文件,而另一个文件(可能已完全写入)

  • 我试图在Ontotext GraphDB中并行运行几个SPARQL查询。除了它们读取的命名图之外,这些查询是相同的。我尝试了Scala中的多线程解决方案来并行启动对数据库的3个查询(见下图)。 问题是我使用的是GraphDB的免费版,它只支持一个核的写操作。这似乎意味着应该并行运行的查询基本上只是排队对单个核运行。正如您所看到的,第一个查询在12秒内完成了41,145个操作,但是其他两个查询都没有