𝒦𝒶𝓁𝒶𝓎⛩
type waitMessage struct { msg map[string]chan *structure.Message mu sync.Mutex } func (w *waitMessage) Set(msg structure.Message) { w.mu.Lock() defer w.mu.Unlock() w.msg[msg.ID] = make(chan structure.Message,1) w.msg[msg.ID] <- msg } func (w *waitMessage) Get(id string) (msg structure.Message) { w.mu.Lock() defer w.mu.Unlock() defer delete(w.msg,id) msg <- w.msg[id] return }
Илья
его нельзя копировать
так поэтому и указатель) чтобы не колпировать а гарантированно иметь только один
𝒦𝒶𝓁𝒶𝓎⛩
разве не так?
Илья
чем плох указатель на мьютекс?
𝒦𝒶𝓁𝒶𝓎⛩
или это говно
Kirya
тем что это bad practice
Chebyrash
Илья
его не надо копировать просто
а если стурктуру передадут по занчению?
Илья
тем что это bad practice
не спорю, но почему?
Chebyrash
а если стурктуру передадут по занчению?
Тоже интересует этот вопрос.
𝒦𝒶𝓁𝒶𝓎⛩
ну вообще он будет сокрыт в структуре для других пакето поэтому можно ссылку и не использовать
Илья
ну вообще он будет сокрыт в структуре для других пакето поэтому можно ссылку и не использовать
проблемы возникают когда кто-то внешний объект передаст по значению, а мапа сама по себе ссылочный тип и будет коллизия/гонка/конкуррентный доступ
Илья
обычно это случается при развитии кода, когда новые люди что-то дописывают
Илья
что не отрицает что это может быть bad practice
Илья
но я хочу узнать откуда такое мение
𝒦𝒶𝓁𝒶𝓎⛩
окей гайс у меня проблема и не понимание остались почему у меня ошибка
𝒦𝒶𝓁𝒶𝓎⛩
var TLSConnActive map[string]client_tls type waitMessage struct { msg map[string]chan *structure.Message mu *sync.Mutex } func (w *waitMessage) Set(msg structure.Message) { w.mu.Lock() defer w.mu.Unlock() w.msg[msg.ID] = make(chan structure.Message,1) w.msg[msg.ID] <- msg } func (w *waitMessage) Get(id string) (msg structure.Message) { w.mu.Lock() defer w.mu.Unlock() defer delete(w.msg,id) msg <- w.msg[id] return }
𝒦𝒶𝓁𝒶𝓎⛩
var TLSConnActive map[string]client_tls type waitMessage struct { msg map[string]chan *structure.Message mu *sync.Mutex } func (w *waitMessage) Set(msg structure.Message) { w.mu.Lock() defer w.mu.Unlock() w.msg[msg.ID] = make(chan structure.Message,1) w.msg[msg.ID] <- msg } func (w *waitMessage) Get(id string) (msg structure.Message) { w.mu.Lock() defer w.mu.Unlock() defer delete(w.msg,id) msg <- w.msg[id] return }
𝒦𝒶𝓁𝒶𝓎⛩
# region45/obereg_video/tls_server tls_server/users.go:20:19: cannot use make(chan structure.Message, 1) (type chan structure.Message) as type chan *structure.Message in assignment tls_server/users.go:21:19: cannot use msg (type structure.Message) as type *structure.Message in send tls_server/users.go:28:9: invalid operation: msg <- w.msg[id] (send to non-chan type structure.Message) tls_server/users.go:74:17: invalid operation: c.write <- msg (send to non-chan type *chan interface {}) tls_server/users.go:78:1: missing return at end of function # region45/obereg_video/web_server web_server/web_server.go:61:5: undefined: tls_conn_active
𝒦𝒶𝓁𝒶𝓎⛩
я тут в одного пишу и мне обсудить не скем даже
Kirya
убери звезду func (w *waitMessage) Set(msg structure.Message) {
Илья
тип же разнй
Kirya
func (w waitMessage) Set(msg structure.Message) {
Илья
func (w waitMessage) Set(msg structure.Message) {
вот тогда точно нужен указател на мьютекс)
Kirya
хотя не, не убирай)
Илья
иначе это уже другой будет мьютекс
𝒦𝒶𝓁𝒶𝓎⛩
type waitMessage struct { msg map[string]chan *structure.Message mu *sync.Mutex } func (w *waitMessage) Set(msg structure.Message) { w.mu.Lock() defer w.mu.Unlock() w.msg[msg.ID] = make(chan *structure.Message,1) w.msg[msg.ID] <- msg } func (w *waitMessage) Get(id string) (msg structure.Message) { w.mu.Lock() defer w.mu.Unlock() defer delete(w.msg,id) msg <- *w.msg[id] return }
Kirya
я не заметил, что он тип на структуру поменял
Илья
w.msg[msg.ID] = make(chan structure.Message,1) w.msg[msg.ID] = make(chan *structure.Message,1)
Илья
вот тут звездока нужна
Илья
и еще, ты каждывй раз заменяешь
Илья
или тут Set только для нового?
𝒦𝒶𝓁𝒶𝓎⛩
Kirya
а вот тут по моуму не нужна msg <- *w.msg[id]
Vladislav
У мьютекса все методы по указателю. Какой вообще по значению?
𝒦𝒶𝓁𝒶𝓎⛩
для гета еще можно было бы подумать
𝒦𝒶𝓁𝒶𝓎⛩
так последняя ошибка осталась
𝒦𝒶𝓁𝒶𝓎⛩
func (w waitMessage) Get(id string) (msg *structure.Message) { w.mu.Lock() defer w.mu.Unlock() defer delete(w.msg,id) msg <- w.msg[id] return }
𝒦𝒶𝓁𝒶𝓎⛩
на этом msg <- w.msg[id]
Илья
https://play.golang.org/p/rQ0iCVpeXGq
Илья
вот тут вроде все норм
Илья
У мьютекса все методы по указателю. Какой вообще по значению?
а сам мьютекс уже другой, если его скопировали не по указателю
𝒦𝒶𝓁𝒶𝓎⛩
а точно
Илья
а точно
я ссылку скинал, ага) там починено)
𝒦𝒶𝓁𝒶𝓎⛩
вери сенкс
𝒦𝒶𝓁𝒶𝓎⛩
прям счастье
𝒦𝒶𝓁𝒶𝓎⛩
Самые отзывчивые посонны.
Vladimir
@Nixolay https://play.golang.org/p/D4oURfTzIoB я бы от чего-то такого отталкивался
Илья
а вообще ты что-то странное делаешь (я так и ен узнал зачем) но сделал несколько видеостриминговых сервисов, и не столкнулся с подобным, очень любопытно
Vladimir
я не уверен что идея базовая ок, но я считаю что это проблема автора идеи
Илья
это все без единого белого?
𝒦𝒶𝓁𝒶𝓎⛩
да
Илья
а как TCP сессия устанавливается?
Vladimir
Расскажи как отдать видео с 4 камер за серым ip на веб морду клиента за серым ip
сочувствую что у тебя камеры ) я лет 10 назад был бедным голодным студентом, наелся с ними на халтурках
Vladimir
Расскажи как отдать видео с 4 камер за серым ip на веб морду клиента за серым ip
если не нужно повтороное переиспользование данных, то я бы не парился и в соединении от пользователя устанавливал новое с камерами и читал бы с таймаутами байтики и писал бы их сразу в ответку
Vladimir
кажется что топорно, но таки должно работать
Vladislav
Так. А объясните как вообще пакеты доходят без белых IP? @Nixolay
𝒦𝒶𝓁𝒶𝓎⛩
Так. А объясните как вообще пакеты доходят без белых IP? @Nixolay
На машине стоит малинка она устанавливает соединение с сервером мои, написанным на го
𝒦𝒶𝓁𝒶𝓎⛩
малинка режит на чанки видео и шлет мне
𝒦𝒶𝓁𝒶𝓎⛩
Anonymous
Короче говоря, обязательно нужен один комп с белым IP.
Vladislav
Ну так белый все таки есть.
𝒦𝒶𝓁𝒶𝓎⛩
подразумевается что по запросу веб морды она будет запрашивать у машины по tls а машина отправлять нужные чанки и плейлиист
Eugeny
Кто-то вот это использовал: github.com/docker/docker/client
Eugeny
сейчас там метод client.NewEnvClient() стал деприкейтет, и как теперь это использовать не очень понятно
Aleksandr
find usage по коду - находишь пример использования
Eugeny
спс!
Anonymous
https://play.golang.org/p/TvtrMfZDdEr подскажите, почему так работает? и как создать такого бесконечного слушателя правильно?
Andrei 🦉
зачем ты несколько раз вытаскиваешь значение из канала в одной и той же итерации?
Andrei 🦉
https://play.golang.org/p/taYj__NQ08m