arrays - Golang 字节数组通过 channel 通信丢失数据

标签 arrays go channel goroutine

我在我的 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 结构的 channel ,WorkerQueue 是 Worker 结构的 channel 。 每当 WorkQueue 中有许多并发请求时,它就会通过调度程序例程分配给工作人员。

当我向 WorkQueue 发送并发请求时,我发现了问题,其中很少有遗漏,也很少有被多次执行。

例如如果我排队使用 ID 1、2、3、4、5...然后我看到工作人员正在使用 ID 1、2、4、4、5...这里 4 执行了两次,而 3 被遗漏了。当我将 WorkRequest 字段实现为 map[string]string 而不是 []byte 时,相同的代码工作正常。

我是不是遗漏了什么或者 slice 不是线程安全的并且被分配了相同的变量。

最佳答案

在 Go 中,string 是不可变的,所以它工作正常但所有 slice 都是可变的。此外,他们可以共享支持阵列。您没有显示相关代码,但我猜您希望 map 保存 slice 的副本。 slice只是内存中的地址和长度。您需要手动制作一个新 slice 并复制其内容。

要修复您的代码,请在将 slice 放入 map 时复制 slice 。

关于arrays - Golang 字节数组通过 channel 通信丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43111772/

相关文章:

arrays - 如果数组中的元素匹配值,则删除它们

python - 制作类似于 MATLAB 的 Python 2D 掩码数组

go - Go Transport 中的 keep-alive TTL 从不关闭连接

go - channel 卡住的 TCP 到 Redis 服务器

go - 如何在Go中不要对 channel 方向感到困惑?

javascript - 使用 Lodash 计算字符串在数组中重复的次数

javascript - 格式化curl返回数据

go - 如何在gcloud上部署golang应用

go - 用libvlc播放实现previous

antlr - 处理antlr 3中的隐藏 channel