Run()
메서드가있는 Hub
구조체가 고유 한 goroutine에서 실행됩니다. 이 방법은 수신 메시지를 순차적으로 처리합니다. 메시지는 여러 프로듀서 (개별 goroutines)로부터 동시에 도착합니다. 물론이 작업을 수행하려면 channel
을 사용합니다. 그러나 이제 interface
뒤에 Hub
을 숨기고 구현에서 선택할 수 있습니다. 따라서 channel
을 단순한 Hub
의 입력란으로 사용하는 것은 적절하지 않습니다.함수 호출 뒤에 채널을 숨기는 것이 안전합니까?
package main
import "fmt"
import "time"
type Hub struct {
msgs chan string
}
func (h *Hub) Run() {
for {
msg, hasMore := <- h.msgs
if !hasMore {
return
}
fmt.Println("hub: msg received", msg)
}
}
func (h *Hub) SendMsg(msg string) {
h.msgs <- msg
}
func send(h *Hub, prefix string) {
for i := 0; i < 5; i++ {
fmt.Println("main: sending msg")
h.SendMsg(fmt.Sprintf("%s %d", prefix, i))
}
}
func main() {
h := &Hub{make(chan string)}
go h.Run()
for i := 0; i < 10; i++ {
go send(h, fmt.Sprintf("msg sender #%d", i))
}
time.Sleep(time.Second)
}
그래서 난 그냥 h.msgs <- msg
를 호출하고있는 나는 HubInterface
에 추가 할 수 Hub.SendMsg(msg string)
기능을 도입했습니다. 그리고 Go
-newbie로 궁금합니다. 동시성 관점에서 안전합니까? 그렇다면 Go
의 일반적인 접근 방식입니까?
놀이터 here.
예. 나는 당신이 그것이 안전하지 않을 수 있다고 믿게 만들 것이 확실하지 않기 때문에 어떻게 대답 할 지 모르겠습니다. – JimB
@JimB, 실제로, 후드에서 작동하는 방법을 잠시 생각한 후에 채널에 쓰는 것이 스레드로부터 안전하다는 대답은 매우 분명하다는 것을 깨달았습니다. –
_ 하나의 채널은 send 문, 수신 작업 및 내장 함수 호출을 추가 동기화없이 원하는 수의 goroutine에 의해 사용할 수 있습니다 ._ 더 자세한 내용은 [채널을 제대로 사용해야하는 경우 뮤텍스를 사용합니까?] (http://stackoverflow.com/questions/34039229/if-i-am-using-channels-properly-should-i-need-to-use-mutexes) – icza