У меня есть кусок каналов, которые все получают то же самое сообщение:Убирают ли каналы сохранение при блокировке?
func broadcast(c <-chan string, chans []chan<- string) {
for msg := range c {
for _, ch := range chans {
ch <- msg
}
}
}
Однако, поскольку каждый из каналов в chans
потенциально считываются с разной скоростью, я не хочу, чтобы блокировать другие каналы когда я получаю медленного потребителя. Я решил эту проблему с goroutines:
func broadcast(c <-chan string, chans []chan<- string) {
for msg := range c {
for _, ch := range chans {
go func() { ch <- msg }()
}
}
}
Однако порядок сообщений, которые получают передаваемыми в каждый канал имеет важное значение. Я посмотрел на спецификации, чтобы увидеть, если каналы сохранить порядок, когда блокируется, и все, что я нашел, было это:
Если емкость больше нуля, то канал является асинхронным: коммуникационные операции удастся без блокировки, если буфер не полный (отправляет) или не пустой (получает), и элементы принимаются в том порядке, в котором они отправлены.
Для меня, если запись заблокирована, то она не отправляется, а ждет отправки. В этом предположении выше сказанное ничего не говорится о порядке отправки, когда несколько писем блокируются при записи.
Есть ли гарантии относительно порядка отправки после разблокировки канала?
Я бы посоветовал тщательно обернуть (захватить) переменные, используемые внутри goroutine, в параметры: go func (ch2 <-chan string, msg2 string) {ch2 <- msg2} (ch, msg). Вот небольшая демонстрация, которая не захватывает приводящее к неустойчивому поведению. Http://play.golang.org/p/9RTKvmRe5K – Deleplace
Дальнейший комментарий к реальному ответу (который уже был хорошо объяснен). Просто хотел указать, что есть пакет, который реализует канал с буферизацией, поэтому вам не нужно писать свой собственный код для удаления старых сообщений: https://godoc.org/github.com/eapache/channels – Evan