【问题标题】:Concurrent writeJSON with gorilla websocket package带有 gorilla websocket 包的并发 writeJSON
【发布时间】:2020-08-22 11:36:46
【问题描述】:

Gorilla WebSocket 文档提到 “应用程序负责确保不超过一个 goroutine 并发调用 write 方法,并且不超过一个 goroutine 并发调用 read 方法。”

这是否意味着没有两个 goroutine 即使有不同的 conn ptr 可以同时调用 write 方法,或者这意味着如果我们与不同的 goroutine 共享相同的 conn ptr 则我们不能同时使用该 conn 编写(虽然这似乎很明显).. ?

gorilla doc link

【问题讨论】:

  • 如果包将读取操作限制为一次只能连接一个连接,则该包将无用。

标签: go websocket concurrency


【解决方案1】:

每个连接支持一个并发读取器和一个并发写入器。

连接彼此独立,不共享任何状态。通常,应用程序中的所有连接都有一个 read 方法的调用者。

文档解释说,连接支持的并发性比默认的无并发访问假设多。

【讨论】:

  • 抱歉重复。只是为了最终确认..”所以两个具有不同连接 ptr 的 goroutine 可以同时调用 write 方法吗?”
  • 是的,两个连接中的每一个都可以有一个 writer。连接相互独立,不共享状态。
【解决方案2】:

这是一个基本的并发控制要求,只有一个 goroutine 有写锁。如果只有读锁,那么任何 goroutine 都可以并发读取。但是当一个 goroutine 正在写入时,其他 goroutine 不应该读取或写入相同的值。如果允许,这种情况会产生许多不良状态,例如脏读问题。所以你应该总是在写东西的同时使用互斥锁获得一个排他锁(写锁)。

【讨论】:

  • 所以你的意思是它不依赖于 conn ptr..?
猜你喜欢
  • 2017-08-30
  • 2019-08-11
  • 2018-06-20
  • 2015-06-02
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 2015-09-24
相关资源
最近更新 更多