【问题标题】:Accessing a channel from a different goroutine从不同的 goroutine 访问通道
【发布时间】:2014-06-17 16:07:28
【问题描述】:

我目前有以下代码:

package main

import (
    "fmt"
    "math/rand"
    "time"
)

var channel = make(chan []float32, 1)

func main() {
    aMap := initMap()

    for key := range aMap {
        fmt.Print("the iteration number is: ", key)

        theSlice := aMap[key]
        channel <- theSlice
        go transition(channel)
        time.Sleep(2 * time.Second)

    }
}

func transition(channel chan []float32) {
    newSlice := make([]float32,5)
    newSlice = <- channel
    fmt.Println(newSlice)

    //need to retrieve the last element of the other slice and put it on this newSlice
}

func initMap() map[int][]float32 {
    aMap := make(map[int][]float32)
    for i := 0; i < 2; i++ {
        aMap[i] = []float32{rand.Float32(), rand.Float32(), rand.Float32(), rand.Float32(), rand.Float32()}
    }
    return aMap
}

我们有一个包含两个切片的地图,我想要做的是获取 slice1 的最后一个元素并将其设置为 slice2 的最后一个元素,反之亦然。

我实际上正在从事一个更大的项目,该项目涉及模拟细胞的分裂和分化。由于它是一个模拟,所有的划分和差异化都是同时进行的。问题在于分化,其中 A 型细胞转化为 B 型细胞。每种类型的单元格都存储在不同的数据结构中,我想我可以为每种不同的数据结构使用一个通道,并使用这些通道同时更改数据。

希望这是有道理的。有什么建议吗?

谢谢, CJ

编辑:看来我要问的还不清楚。我对上面示例的问题是,我将如何同时更改两个切片中每个切片的最后一个元素?

【问题讨论】:

  • 我添加了一个编辑来澄清我在问什么。谢谢

标签: concurrency go channel goroutine


【解决方案1】:

频道是两种方式,用于交流,而不是共享内存。因此,也许不是发送整个切片,而是将每个切片中的最后一项发送到通道中,然后以另一种方式发送第二个值。

  func main() {

    ...
    // send only the last item
    theSlice := aMap[key]
    channel <- theSlice[len(theSlice)-1]
    // waiting for the response
    theSlice[len(theSlice)-1] = <- channel
  }

  func transition(channel chan []float32) {
    newSlice := make([]float32,5)
    channel <- newSlice[len(newSlice)-1]
    newSlice[len(newSlice)-1] = <- channel
    fmt.Println(newSlice)
 }

上面的代码确实假设通道声明已经从 slice 更改为 float32 :

 var channel = make(chan float32, 1)

【讨论】:

  • 谢谢,我给出的小例子很有意义。但想象一下我们有超过 2 个切片要处理,我不相信这两种方法会奏效......
  • 顺便说一句:我必须承认我没有编译上面的内容,所以可能是某个地方的错字。
  • Rob Pike 进行了一场精彩的演讲,涵盖了通道的扇入和扇出。 talks.golang.org/2012/concurrency.slide。它有一些很好的并发模式示例,非常值得研究。
猜你喜欢
  • 2013-05-21
  • 2022-01-02
  • 1970-01-01
  • 2018-10-23
  • 2019-10-08
  • 2018-09-10
  • 2020-08-02
  • 2015-06-03
  • 1970-01-01
相关资源
最近更新 更多