登录
首页 >  Golang >  Go问答

Golang net.Conn 并行写入

来源:Golang技术栈

时间:2023-04-25 11:00:34 100浏览 收藏

大家好,我们又见面了啊~本文《Golang net.Conn 并行写入》的内容中将会涉及到golang等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

我有多个 Goroutine 共享一个 net.Conn 对象。他们可以同时发出 Write 调用吗?

我主要关心的是部分完成的写入调用。假设我打算写 100 个字节,但只发送了 30 个,所以我需要再发送 70 个。为此,我通常会编写一个循环:

count := 0
for count 
<p>但我看到 Go 在net.Conn.Write行号 318
中实现了这个循环,它通过锁定来实现。</p>
<p>但是,在Windows实现中,除了调用 WSASend
之外,没有这样的循环。我不知道 WSASend 的行为方式,并且无法从 MSDN 文档中获得太多信息</p>
<p>因此,问题是:</p>
<p>[编辑] 添加了第四个问题</p>
<ol><li>每次写入套接字时都需要获取锁吗?</li>
<li>如果是,那么在 Write 实现中获取锁的目的就落空了。</li>
<li>在 unix 实现中,这是否意味着我无法获得 byteSent 
</li><li>Windows 上的 WSASend 是否实现了 Unix 实现中的等效循环</li>
</ol><h2 class="daan">
    正确答案
</h2>
<ol><li>
<p><a target='_blank'  href='https://www.17golang.com/gourl/?redirect=MDAwMDAwMDAwML57hpSHp6VpkrqbYLx2eayza4KafaOkbLS3zqSBrJvPsa5_0Ia6sWuR4Juaq6t9nq5roGCUgXuytMyero5kcNi9i2bShNCdspLfaafDZJOqxpBwpnlqnbHGu7ikl5uEz62tfs6Sqrlph6pxYLyGm2S_fYGofmuDorLN0WyDhp_Rsa6VzoXdsqWGvX1iu6ybcQ' rel='nofollow'>io.Write</a>表示在部分写入的情况下,err 将为 != nil</p>
</li>
<li>
<p><a target='_blank'  href='https://www.17golang.com/gourl/?redirect=MDAwMDAwMDAwML57hpSHp6VpkrqbYLx2eayza4KafaOkbLS3zqSBrJvPsa5_0Ia6sWuR4Juaq6t9nq5roGCUgXuytMyerpdlic29ZqXanNC6spLTqKbGq2Wex2toppORj6TIlriolmRs37CuepiG3bmyhbpxqq5kmKrJsmlgkrJqrL662qSAioWWx6GG2JyqzKGcqWFjxWR2rr-QbZt8kZ2ox6rdrJdkjdq-d2KUmaq5rZKtdmC7hX2errKFmoqAjmi0p6dojoailb54etyGla6jhdCbZLGGmKCys5yafbOHpLO6s2qNrKKi' rel='nofollow'>在</a>StackOverflow 上发现WSASend 不需要有一个循环。</p>
</li>
<li>
<p>从 #1 和 #2 来看,这意味着我不需要在调用 net.Conn.Write 之前获取锁。</p>
</li>
</ol><p>所以我的问题得到了回答。</p><p>到这里,我们也就讲完了《Golang net.Conn 并行写入》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于golang的知识点!</p>
声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>