2014-02-27 24 views
0

我想知道在for循環中創建的通道是否可以由循環中併發運行的子例程交替使用?GO使用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 
} 

有一種方法是子程序(地圖[0])例如,子程序(圖1中的for循環,即信道[的另一次迭代期間可以訪問創建的另一個信道])?

背景:我目前正在研究一個項目,我必須模擬不同的細胞種羣。每個細胞都有能力劃分/區分/等等。爲了複製真實的系統,不同的人羣必須相互並行運行。問題是,我必須在不同的人羣中工作時插入/移除特定人羣類型的細胞,這就是渠道發揮作用的地方。我正在考慮同時處理每個人都有相關頻道的人羣。這就是爲什麼我問我們是否可以使用在不同的循環迭代中創建的通道。

我希望人們明白我在問什麼。

謝謝!

編輯:我決定添加一些我的代碼來支持我的CONTEXT描述和解釋不同元素的註釋。我收錄了頻道,但我不知道它是否有效。我希望它有助於理解什麼是我想要做的事:

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

你有沒有編寫任何代碼,但你可以顯示?你所要求的並不合理。你的代碼中的各種goroutines如何訪問其他渠道而不參考它們? – JimB

+0

我正在模塊化我的代碼的過程中,即將特定的功能放在它們各自的功能中。我問了這個問題,因爲我很難用這個思路「可視化」系統工作的算法,我想如果我和那些瞭解渠道行爲的人討論過,也許會幫助我以及如何使用它們。我會稍後更新這個問題。 – sSmacKk

+0

您可以引入一個控制通道和一個控制例程來處理interroutine通信,而不是所有能夠相互引用的例程。 –

回答

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 
} 

取決於你想要做什麼,你需要訪問,你哪個渠道不妨玩弄循環或者甚至做多重循環。

+0

在我的問題中添加了一些新的代碼後,我明白你的建議。我會給它一個去看看會發生什麼。 TY – sSmacKk