to go zważywszy na poniższym przykładzie: http://play.golang.org/p/owvJ8Oi77Swątku bezpieczny sposób do komina danych z wielu procedur
func produce(dataChannel chan int) {
for i := 0; i < 10; i++ {
dataChannel <- i
}
}
func main() {
dataChannel := make(chan int)
go produce(dataChannel)
go produce(dataChannel)
go produce(dataChannel)
for i := 0; i < 30; i++ {
data := <-dataChannel
fmt.Printf("%v ", data)
}
}
Czy moje założenie, że pisanie do kanału z wielu procedur niebezpieczne to go prawidłowe?
Czy istnieje wspólny/idiomatyczny sposób na bezpieczne wykonanie tej czynności? Wiem, że możesz stworzyć oddzielny kanał dla każdej rutyny, która produkuje dane, zastanawiałem się tylko, czy to było najczystsze rozwiązanie, czy istnieją inne alternatywy.
Jedyną szczególną cechą kanału pod tym względem jest to, że można je zamknąć tylko raz i nic nie może zostać wysłane po zamknięciu kanału. Aby to lepiej zrozumieć, spróbuj zmodyfikować swój przykład, aby uzyskać zasięg nad kanałem zamiast ustalonego rozmiaru i działać, dopóki nie zostanie ukończony. Nieco trudniejsze, ale dobrze to zrozumieć. – Dustin
Tak, moim głównym zmartwieniem było pisanie do tego samego kanału z wielu procedur/wątków. Nie było dla mnie jasne, że można to bezpiecznie zrobić. – Chris