Меня привлекло Fyne (и, следовательно, Go) обещанием безопасности потоков. Но теперь, когда я стал лучше читать Go, я вижу вещи, которые заставляют поверить, что API в целом не является поточно-ориентированным и, возможно, никогда не предназначался для этого. Поэтому я пытаюсь определить, что означает «потокобезопасность» в Fyne.
Я специально смотрю на
func (l *Label) SetText(text string) {
l.Text = text
l.textProvider.SetText(text) // calls refresh
}
и отмечаю, что l.Text также является строкой. Назначения в Go не являются потокобезопасными, поэтому для меня очевидно, что если два потока сражаются за текст метки и оба вызывают label.SetText одновременно, я могу ожидать повреждения памяти.
«Но вы бы этого не сделали», можно сказать. Нет, но меня беспокоит случай, когда кто-то редактирует содержимое записи, в то время как поток приложения решает, что ему нужно заменить весь текст записи - это вполне возможно в моем приложении, поскольку он поддерживает одновременное редактирование несколькими пользователями по сети, поэтому обновления для всех видов виджетов приходят асинхронно. (Обратите внимание, мне все равно, что произойдет, если два человека отредактируют одну и ту же запись одновременно; чьи-то изменения будут потеряны, а мне все равно, кто это. Но это не должно привести к повреждению памяти.) Обратите внимание, что один подход я мог бы Взять, чтобы фоновый поток создал совершенно новый виджет Entry, который затем заменил бы тот в текущем Box. Но этот поток безопасен?
Не то, чтобы я не знал, как сериализовать вещи с каналами. Но я надеялся, что Файн устранит необходимость в этом (сообщение в блоге утверждает, что это так); и даже используя каналы, я не могу убедить себя в том, что пользователь, вмешивающийся в виджет различными способами, в то время как какой-то фоновый поток изменяет его, скрывает его и т. д. c, не приведет к сбоям. Может быть, все, что сериализовано под обложками и совершенно безопасно, но я не хочу выяснять, каким трудным для него является это, потому что у меня не будет способа это исправить.
Файн, очевидно, довольно новичок и, кажется, имеет много обещаний, но документация кажется легкой в деталях. Где-то больше информации? Люди пробовали это успешно?