Здравствуйте, учу Go.
Есть два горутина, один пишет в канал (sender), другой эти данные читает (reader). Однако первый пишет чаще, чем второй читает. Нужно чтобы sender мог записать число в канал, даже если reader его еще не считал, то есть обновить, а reader считывал только свежие данные.
При этом sender работает не совсем стабильно, по физическим причинам, и не гарантирует что получит данные для записи в канал за известный период времени.
Добрый день.
Насколько я понял для такой задачи каналы не особо подходят.
Если в случае новой записи в канал данные теряют актуальность, то лучше применить замыкания например так:
func Entangle() (in func(interface{}), out func() interface{}) {
var data interface{}
var mu sync.Mutex
in = func(d interface{}) {
mu.Lock()
data = d
mu.Unlock()
}
out = func() interface{} {
mu.Lock()
d := data
mu.Unlock()
return d
}
return in, out
}
и с помощью возвращенной функции in - писать, а с out - читать.
Можно так же применить мьютекс для гарантии целостности данных при конкурентном считывании и записи, так же замкнутый между этими двумя функциями, но это иногда может быть не обязательно
Использовать (durable) очереди сообщений или буферизованный канал (указав длину канала), способный вместить достаточное количество сообщений (например, 100) Но если программа получит сигнал прерывания, то они будут утеряны. Поэтому 1-й вариант надежнее.
а reader считывал только свежие данные.
Если в сообщении отправлять атрибут времени отправки, то получатель может отбросить сообщение, если оно стало неактуально.