Подтвердить что ты не робот

Безопасный поток для воронки данных из нескольких процедур go

В следующем примере: http://play.golang.org/p/owvJ8Oi77S

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

Является ли мое предположение о том, что запись в канал из нескольких правил работы небезопасна?

Есть ли общий/идиоматический способ сделать это безопасно? Я знаю, что вы можете сделать отдельный канал для каждой подпрограммы, которая производит данные, мне просто интересно, было ли это самое чистое решение или были ли другие альтернативы.

4b9b3361

Ответ 1

Каналы полностью потокобезопасны. Они являются официальным способом общения между гортанами. Я не вижу ничего плохого в вашем коде. Это красота Го.

Ответ 2

Каналы предназначены для совместного использования потоков (и это нормальный смысл "быть потокобезопасным" ). Использование каналов означает, что у вас нет общей памяти, с опасностями гонки, которые вы рискуете. Поэтому ответ Даниила правильный: используйте каналы, потому что они предназначены для них.

Но обратите внимание, что goroutines создают сети для передачи последовательных процессов, которые могут иногда блокироваться, если есть ошибка дизайна. Они также могут жить (то же самое, но быть занятыми).

Существует значительный объем знаний о том, как избежать тупиковой ситуации/жизни. Большая часть из них - это дни, когда Оккам был популярен в 80-х и 90-х годах. Есть несколько специальных драгоценных камней от таких людей, как Джереми Мартин (Стратегия дизайна для Deadlock-Free Параллельные системы), Питер Уэлч (Парадигмы высокого уровня) и другие.