Golang 字节数组通过通道通信丢失数据
Golang byte array communication through channel loses data
我在我的 golang 项目中使用工作人员队列实现。
WorkRequest 结构如下
type WorkRequest struct {
fields map[string] []byte }
并且 dipatcher 是
go func() {
for {
select {
case work := <-WorkQueue:
go func() {
worker := <-WorkerQueue
worker.Work <- work
}()
}
}
}()
worker.Work
是 WorkRequest 结构的通道,WorkerQueue 是 Worker 结构的通道。
每当有许多并发请求进入 WorkQueue 时,它就会通过调度程序例程分配给工作人员。
我在向 WorkQueue 发送并发请求时发现问题,其中很少有遗漏,也很少有多次执行。
例如如果我排队使用 ID 1、2、3、4、5...然后我看到工作人员正在使用 ID 1、2、4、4、5...这里 4 执行了两次,而 3 被遗漏了。当我将 WorkRequest 字段实现为 map[string]string 而不是 []byte 时,相同的代码工作正常。
我是不是遗漏了什么或者切片不是线程安全的并且被分配了相同的变量。
在 Go 中 string
是不可变的,所以它工作正常但所有切片都是可变的。此外,他们可以共享支持阵列。您没有显示相关代码,但我猜您希望地图保存切片的副本。 slice 只是内存中的地址和长度。您需要手动制作一个新切片并复制其内容。
要修复您的代码,请在将切片放入地图时复制切片。
我在我的 golang 项目中使用工作人员队列实现。 WorkRequest 结构如下
type WorkRequest struct {
fields map[string] []byte }
并且 dipatcher 是
go func() {
for {
select {
case work := <-WorkQueue:
go func() {
worker := <-WorkerQueue
worker.Work <- work
}()
}
}
}()
worker.Work
是 WorkRequest 结构的通道,WorkerQueue 是 Worker 结构的通道。
每当有许多并发请求进入 WorkQueue 时,它就会通过调度程序例程分配给工作人员。
我在向 WorkQueue 发送并发请求时发现问题,其中很少有遗漏,也很少有多次执行。
例如如果我排队使用 ID 1、2、3、4、5...然后我看到工作人员正在使用 ID 1、2、4、4、5...这里 4 执行了两次,而 3 被遗漏了。当我将 WorkRequest 字段实现为 map[string]string 而不是 []byte 时,相同的代码工作正常。
我是不是遗漏了什么或者切片不是线程安全的并且被分配了相同的变量。
在 Go 中 string
是不可变的,所以它工作正常但所有切片都是可变的。此外,他们可以共享支持阵列。您没有显示相关代码,但我猜您希望地图保存切片的副本。 slice 只是内存中的地址和长度。您需要手动制作一个新切片并复制其内容。
要修复您的代码,请在将切片放入地图时复制切片。