원격 서버 (암페어 채널)에서 들어오는 메시지를 처리하는 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
를 얻을 것이다 그들이 실행됩니다. 그리고 나중에 또 다른 세 번째 기능을 추가하면 상황이 더욱 복잡해질 것입니다. 달리기를 제외한 다른 모든 이동 루틴을 어떻게 차단할 수 있습니까? 다른 어떤 더 나은 해결책?
받은 채널을 결코 확인하지 않으므로 내 채널이 자신이 생각한대로 채널을 운영한다고 생각하지 않습니다. 어쨌든 버퍼 된 채널을 뮤텍스/세마포어로 사용하면 위험 할 수 있습니다. 대신 실제 뮤텍스를 사용하십시오. – JimB
"gouroutines"라고하며 루틴은 사용하지 않습니다. 이것은 "루틴"이라는 단어가 프로 시저 PL의 프로 시저/함수를 참조 할 수 있기 때문에 "이동 루틴"은 용어의 의도 된 의미를 사라지게하는 "이동 루틴"처럼 들릴 수 있습니다. – kostix