我看过这个,这个,这个和这个,但在这种情况下没有一个真正帮助我。我有多个戈鲁丁,如果通道中的值是针对该特定戈鲁廷的,则需要执行一些任务。
var uuidChan chan string
func handleEntity(entityUuid string) {
go func() {
for {
select {
case uuid := <-uuidChan:
if uuid == entityUuid {
// logic
println(uuid)
return
}
case <-time.After(time.Second * 5):
println("Timeout")
return
}
}
}()
}
func main() {
uuidChan = make(chan (string))
for i := 0; i < 5; i++ {
handleEntity(fmt.Sprintf("%d", i))
}
for i := 0; i < 4; i++ {
uuidChan <- fmt.Sprintf("%d", i)
}
}
https://play.golang.org/p/Pu5MhSP9Qtj
在上面的逻辑中,uuid 由其中一个通道接收,但没有任何反应。为了解决这个问题,我尝试更改逻辑,以便在某个 uuid 的逻辑不在该例程中时将 uuid 重新插入到通道中。我知道这是一种不好的做法,这也行不通。
func handleEntity(entityUuid string) {
go func() {
var notMe []string // stores list of uuids that can't be handled by this routine and re-inserts it in channel.
for {
select {
case uuid := <-uuidChan:
if uuid == entityUuid {
// logic
println(uuid)
return
} else {
notMe = append(notMe, uuid)
}
case <-time.After(time.Second * 5):
println("Timeout")
defer func() {
for _, uuid := range notMe {
uuidChan <- uuid
}
}()
return
}
}
}()
}
https://play.golang.org/p/5On-Vd7UzqP
正确的方法是什么?
泛舟湖上清波郎朗
杨魅力
相关分类