gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:05:03 27 4
gpt4 key购买 nike

我在我的 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/

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