Как правильно буферизовать каналы, чтобы они не блокировались при вставке из выбора? Делает это в goroutine антипаттерном - PullRequest
1 голос
/ 16 января 2020

Например, если бы у меня было выражение select вроде этого:

ch1 := make(chan string, 1)
ch2 := make(chan string, 1)

ch1 <- "hi"
ch2 <- "bye"

select {
case msg := <-ch1:
    if msg == "hi":
        ch2 <- msg
case <-ch2:
    // do something
}

Есть вероятность, что это заблокируется, поскольку в ch2 уже есть строка. Я предполагаю, что это антипаттерн:

ch1 := make(chan string, 1)
ch2 := make(chan string, 1)

ch1 <- "hi"
ch2 <- "bye"

select {
case msg := <-ch1:
    if msg == "hi":
        go func() {ch2 <- msg}()
case <-ch2:
    // do something
}

Очевидно, что это несколько надумано, но у меня похожая ситуация, когда в моем главном потоке есть оператор выбора для n каналов, а другие процессы добавляют элементы в эти каналы. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...