2013-03-14 4 views
1

원격 서버 (암페어 채널)에서 들어오는 메시지를 처리하는 2 개의 루틴이 있습니다. 하지만 그들은 같은 데이터/상태에서 처리하기 때문에 실행중인 것을 제외하고 다른 모든 이동 루틴을 차단하고 싶습니다.실행중인 것을 제외한 모든 goroutine을 차단하는 방법

내가 그것을을 출시 할 때마다 다음 루틴 블록을 이동하고 chan bool를 사용하는 솔루션을 마련, 코드 같은 것입니다 :

package main 

func a(deliveries <-chan amqp, handleDone chan bool) { 
    for d := range deliveries { 
     <-handleDone  // Data comes always, wait for other channels 
     handleDone <- false // Block other channels 

     // Do stuff with data... 

     handleDone <- true // I'm done, other channels are free to do anything 
    } 
} 

func b(deliveries <-chan amqp, handleDone chan bool) { 
    for d := range deliveries { 
     <-handleDone 
     handleDone <- false 
     // Do stuff with data... 
     handleDone <- true 
    } 
} 

func main() { 
    handleDone := make(chan bool, 1) 
    go a(arg1, handleDone) 
    go b(arg2, handleDone) 
    // go c(arg3, handleDone) , later 

    handleDone <- true // kickstart 
} 

그러나

처음으로 함수의 각각은, handleDone <- true를 얻을 것이다 그들이 실행됩니다. 그리고 나중에 또 다른 세 번째 기능을 추가하면 상황이 더욱 복잡해질 것입니다. 달리기를 제외한 다른 모든 이동 루틴을 어떻게 차단할 수 있습니까? 다른 어떤 더 나은 해결책?

+0

받은 채널을 결코 확인하지 않으므로 내 채널이 자신이 생각한대로 채널을 운영한다고 생각하지 않습니다. 어쨌든 버퍼 된 채널을 뮤텍스/세마포어로 사용하면 위험 할 수 있습니다. 대신 실제 뮤텍스를 사용하십시오. – JimB

+0

"gouroutines"라고하며 루틴은 사용하지 않습니다. 이것은 "루틴"이라는 단어가 프로 시저 PL의 프로 시저/함수를 참조 할 수 있기 때문에 "이동 루틴"은 용어의 의도 된 의미를 사라지게하는 "이동 루틴"처럼 들릴 수 있습니다. – kostix

답변

2

저는 왜 당신이 이것을 원하고 있는지 궁금합니다 - deliveries에있는 각 메시지를 독립적으로 처리 할 수없는 이유는 무엇입니까? 왜 그 메시지를 처리하는 두 가지 다른 기능이 있습니까? 각각이 특정 유형의 메시지에 대한 책임이있는 경우, 하나의 deliveries 수신기가 해당 유형에 적합한 논리로 발송되기를 원하는 것처럼 보입니다.

질문에 대답하기 위해 나는 각 기능이 시작시 truehandleDone에서 가져 오는 것이 사실이라고 생각하지 않습니다. 하나 (a이라고 가정 해 봅시다)는 main에서 전송 된 true을 수신합니다. 다른 하나 (b)는 false이 첫 번째로 전송됩니다. 당신이받은 가치를 폐기하고 있기 때문에 이것을 말할 수 없습니다. 둘 다 실행 중이며 버퍼링 된 채널을 사용하고 있습니다 (버퍼되지 않은 채널 대신 make(chan bool)을 사용하려는 경우). 특히 세 번째 goroutine을 추가 할 때 혼란이 계속됩니다.

handleDone <- false은 실제로 아무 것도 수행하지 않습니다. 릴레이 경기의 배턴으로 handleDone의 모든 값을 처리하십시오. goroutine이이 값을 받으면 그 일을 할 수 있습니다. 완료되면 채널로 보내 다음 goroutine으로 전달해야합니다.

+0

의견을 보내 주셔서 감사합니다. 코드의 일부분을 변경했습니다. 나는'거짓'을 제거했다. 하지만 지금은 스택에 도달하고 기다리는 중입니다. 두 개의 go 함수에서'<-handleDone'을 기다린다. 그들이 본부에서 진실을 얻지 못하는 것 같습니다. –

+0

그럼'main'은 무엇을하고 있습니까? handleDone <- true'에 도달 했습니까? –

+0

'handleDone <- true' 다음에'func a()'가 단지'func b()'를 기다리는 것이 문제이지만'func b()'는 전혀 실행되지 않습니다. 내가 원하는 것은 이동 루틴 ('a()','b()'등이 실행 중일 때 실행중인 것이 실행될 때까지 기다려야하는 것보다 언제나 필요합니다. –

3

들어오는 메시지 스트림이 있고 해당 스트림에서 듣고 처리하는 goroutine이 3 개인 경우 한 번에 하나의 goroutine 만 실행되도록하려면 간단하게 goroutines 중 두 개를 죽이십시오 .

동시성을 높이고 복잡성을 추가 한 다음 동시에 실행하지 못하게하려고합니다. 최종 결과는 단일 스트림 판독기와 동일하지만 잘못 될 수있는 많은 사항이 있습니다.

관련 문제