GO 使用由 for 循环创建的通道

Posted

技术标签:

【中文标题】GO 使用由 for 循环创建的通道【英文标题】:GO using channels created by for loop 【发布时间】:2014-03-31 08:21:08 【问题描述】:

我想知道在 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

例如,有没有办法让 subroutine(Map[0]) 可以访问在 forloop 的另一个迭代期间创建的另一个通道,即 subroutine(Map[1]) 的通道?

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

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

谢谢!

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

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)
  

【问题讨论】:

你写过代码吗?你问的真的没有意义。您代码中的各种 goroutine 将如何访问其他通道而不参考它们? 我正在对我的代码进行模块化,即将特定的功能放在它们各自的功能中。我问了这个问题,因为我很难“可视化”系统如何使用这种思路来工作的算法,我想如果我与了解渠道行为的人讨论可能会对我有所帮助以及如何使用它们。稍后我会适当地更新问题。 您可以引入一个控制通道和一个控制例程来处理程序间通信,而不是所有例程都能够相互引用。 【参考方案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

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

【讨论】:

在我的问题中添加了一些新代码后,我理解了你的提议。我会试一试,看看会发生什么。 ty

以上是关于GO 使用由 for 循环创建的通道的主要内容,如果未能解决你的问题,请参考以下文章

并发——轻量级线程,通道,单向通道

如何在循环中创建频道?

Kotlin 协程Channel 通道 ② ( Channel 通道容量 | Channel 通道迭代 | 使用 iterator 迭代器进行迭代 | 使用 for in 循环进行迭代 )

Kotlin 协程Channel 通道 ② ( Channel 通道容量 | Channel 通道迭代 | 使用 iterator 迭代器进行迭代 | 使用 for in 循环进行迭代 )

是否可以在处理时向Go频道添加项目?

Go并发循环逻辑