Задать вопрос

Как писать в канал без блокировки golang?

Здравствуйте, учу Go.
Есть два горутина, один пишет в канал (sender), другой эти данные читает (reader). Однако первый пишет чаще, чем второй читает. Нужно чтобы sender мог записать число в канал, даже если reader его еще не считал, то есть обновить, а reader считывал только свежие данные.
При этом sender работает не совсем стабильно, по физическим причинам, и не гарантирует что получит данные для записи в канал за известный период времени.
  • Вопрос задан
  • 248 просмотров
Подписаться 3 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@fops9311
Добрый день.
Насколько я понял для такой задачи каналы не особо подходят.
Если в случае новой записи в канал данные теряют актуальность, то лучше применить замыкания например так:

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 - читать.
Можно так же применить мьютекс для гарантии целостности данных при конкурентном считывании и записи, так же замкнутый между этими двумя функциями, но это иногда может быть не обязательно
Ответ написан
2ord
@2ord
Использовать (durable) очереди сообщений или буферизованный канал (указав длину канала), способный вместить достаточное количество сообщений (например, 100) Но если программа получит сигнал прерывания, то они будут утеряны. Поэтому 1-й вариант надежнее.
а reader считывал только свежие данные.
Если в сообщении отправлять атрибут времени отправки, то получатель может отбросить сообщение, если оно стало неактуально.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы