gpt4 book ai didi

go - 在几个不同的 goroutine 之间共享一个 slice

转载 作者:IT王子 更新时间:2023-10-29 01:54:52 29 4
gpt4 key购买 nike

鉴于我有一片 User 类型的结构

Users := make([]User)

我正在监听 TCP 连接,当用户连接时,我将向此 slice 添加一个新用户。

我这样做的方法是设置一个 NewUsers channel ​​

NewUsers := make(chan User)

在新的 TCP 连接时,一个 User 被发送到这个 channel ,一个中央函数等待一个 User 到达以将其添加到 Users slice 。

但现在我想要多个子系统(包/功能)使用这个用户列表。一个功能可能只想接收用户列表,而另一个功能可能想要向每个用户广播消息,或者只向符合特定条件的用户广播消息。

多个函数(可能从不同的 goroutines 执行)如何安全地访问用户列表。我看到两种可能的方法:

  1. 需要访问此列表的每个子系统都需要自己的 AddUser channel 并维护自己的用户部分,并且需要将新用户广播到这些 channel 中的每一个 channel 。
  2. 使用 Mutex 阻止访问

选项 1 似乎非常复杂并且会产生相当多的重复,但我的理解是如果您尝试坚持“通过通信共享内存”的口头禅,最好避免使用互斥体。

最佳答案

在并发事件之间共享数据的惯用 Go 方式总结如下:

Do not communicate by sharing memory; instead, share memory by communicating.

安德鲁杰兰德 blogged about this ,例如。

它不需要过于复杂;您可以考虑设计内部微服务,使用带有 channel 的 goroutines 表示。

在您的情况下,这可能意味着设计一个服务元素以包含用户列表的主副本。

Go/CSP 策略的主要优点是

  • 并发性是一种设计选择,以及您设计的其他方面
  • 只需要本地知识来理解并发行为:这是因为 goroutine 本身可以由内部 goroutines 组成,如果需要的话,这会一直应用下去。了解更高级别 goroutine 的外部行为仅取决于其接口(interface),而不取决于隐藏的内部结构。

但是……

有时,一个安全共享的数据结构(由互斥体保护)现在和永远都足够了。然后可能会争辩说 goroutines 和 channel 的额外复杂性不是必需的。

安全共享的列表数据结构是您会发现许多人作为开源 API 提供的东西。 (我自己有一个 - 请参阅 runtemplate 中的内置函数)。

关于go - 在几个不同的 goroutine 之间共享一个 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38288459/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com