2014-02-27 2 views
0

for 루프에서 생성 된 채널이 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 즉 채널 (맵 [(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

아직 코드를 작성 했습니까? 당신이 묻는 것은 실제로 의미가 없습니다. 코드에있는 다양한 goroutine은 다른 채널을 참조하지 않고 어떻게 다른 채널에 액세스합니까? – JimB

+0

나는 자신의 코드를 모듈화하는 과정에있다. 즉, 각각의 기능에 특정 기능을 넣는 것이다. 나는이 문제에 대해 물었습니다. 왜냐하면 저는이 사고 방식을 사용하여 시스템이 어떻게 작동하는지 알고리즘을 "시각화"하는 데 어려움을 겪고 있기 때문에 채널의 행동을 아는 사람들과 토론을하면 도움이 될 것이라고 생각했습니다. 그리고 그것들을 어떻게 사용할 수 있는지에 대해 설명합니다. 질문을 적절하게 업데이트 할 것입니다. – sSmacKk

+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 
} 

이 따라하고 어떤 채널 당신은 당신에 액세스 할 필요가 : 이전 채널에 대한 참조를 가지고지도의 각 요소를 원하는 경우 예를 들어, 당신이 뭔가를 할 수 있습니다 루핑과 함께 놀기를 원할 수도 있고 심지어는 여러 루프를 수행 할 수도 있습니다.

+0

내 질문에 새로운 코드를 추가 한 후 귀하의 제안을 이해합니다. 나는 그것을 풀어서 어떤 일이 일어나는지 보게 될 것이다. 타이 – sSmacKk