使用for循环创建的频道进行播放

时间:2014-02-27 17:50:58

标签: for-loop concurrency go channel

我想知道for循环中创建的通道是否可以与for循环同时运行的子程序互换使用?

伪代码:

for i := range Map {
      channel := make(chan my_type, buff_size)

      go subroutine(Map[i], channel)
}

func subroutine(name valueType, channel channelType) {
    //stuff here
}

是否存在子程序(Map [0])的方式,例如,可以访问在forloop的另一次迭代期间创建的另一个通道,即子程序的通道(Map [1])?

背景:我目前正在开展一个项目,我必须模拟不同的细胞群。每个细胞都具有分裂/分化/等的能力。为了复制真实系统,不同的群体必须彼此同时运行。问题是我必须在处理不同的人口时插入/删除特定人口类型的单元格,这是渠道发挥作用的地方。我正在考虑同时运行人群,每个人都有一个相关的频道。这就是为什么我问我们是否可以使用在不同的for循环迭代中创建的通道。

我希望人们明白我在问什么。

谢谢!

编辑:我决定添加一些代码以支持我的上下文描述,其中包含解释不同元素的注释。我已经包含了频道,但我不知道它是否有效。我希望它有助于理解我正在尝试做的事情:

func main() {
  //where envMap is a map[int]Population and Population is a struct
  envMap := initialiseEnvironment(envSetupInfo)

  //general simulation loop
  for i := 0; i < 10; i++ {
     //loop to go through all envMap elements in parallel 
     for eachKey := range envMap {
         channel := make(chan type)
         go simulateEnv(envMap[eachKey])
     }
  }
}

func simulateEnv(cellPopulation Population, channel chan) {
  //each Population has a map[int]Cell where Cell is a struct with cell properties
  cellMap := cellPopulation.cellMap

  for eachCell := range cellMap {
      go divisionTransition(eachCell, channel)
  }
}

1 个答案:

答案 0 :(得分:1)

假设地图的每个元素都是一个结构,您可以创建一个字段来保存对其他通道的引用。例如,如果您希望地图的每个元素都引用上一个频道,您可以执行以下操作:

// assumes that Map[whatever] is a struct with a "lastChan" field
var lastRef = chan my_type


for i := range Map {
      channel := make(chan my_type, buff_size)
      if(lastRef != nil){
          Map[i].lastChan = lastRef
      }

      go subroutine(Map[i], channel)
      lastRef = channel
}

func subroutine(name valueType, channel channelType) {
    //stuff here can access the previous channel with name.lastChan
}

根据您想要做什么以及您需要访问哪些频道,您可能希望使用循环或甚至做多个循环。