@proGO

Страница 1310 из 1674
Александр
23.03.2018
14:48:55
выключить дебаг? ?

Человек
23.03.2018
14:49:32
А как его выключить? ?

Александр
23.03.2018
14:50:32
если не ошибаюсь

go build -ldflags "-s -w"

Google
Человек
23.03.2018
14:54:48
Спасибо. Можно ещё вопрос? [С чем это связанно] У меня не находит дебаггер gdb (когда стояла windows 8.1 у меня находило дебагер и дебажил код, а сейчас стоит windows 8.1 и дебагер не найден "'gdb' is not recognized as an internal or external command, operable program or batch file.") go version go1.10 windows/amd64

Причем в переменную среды я ничего тогда и сейчас не вписывал

Александр
23.03.2018
14:55:26
под винду не знаю, увы

Человек
23.03.2018
14:57:00
ладно, спасибо

Andrew
23.03.2018
14:57:41
анмаршалю xml, как проверить на отсутствие элемента(который `omitempty`), что бы не обращаться к его свойствам, что вызовет ошибку?

hamper ?
23.03.2018
14:58:13
А есть какой-нибудь способ сделать что-то типа мягкого RLock к мьютексу? Типа попытаться сделать RLock, если мьютекс залочен то вернуть какой-то результат.

Daniel
23.03.2018
15:01:00
нет, нельзя

но можно написать свой такой мьютекс на атомиках

ну или найти такой готовый

hamper ?
23.03.2018
15:01:59
Ага, погуглил уже, хотя пока гуглил, понял что оно мне и не особо то надо. )

Alexey
23.03.2018
15:11:32
коллективный самоответ :)

Google
Andrew
23.03.2018
15:18:26
Используй указатели, Люк!
изи... спасибо, чот тупанул...

hamper ?
23.03.2018
16:53:53
А нормально, что гошный race detector пишет, ворнинги на код внутри atomic.SwapUint64?

WARNING: DATA RACE Write at 0x00c42040d810 by goroutine 114: sync/atomic.SwapInt64() /usr/lib/go/src/runtime/race_amd64.s:254 +0xb

hamper ?
23.03.2018
17:19:19
Не могу к сожалению, там много рабочего кода, но в readat он выдает функцию, внутри которой вызывается 2 раза другая функция, внутри которой atomic.AddInt64 на эту переменную (и вообще это приватное поле структуры, которое не читается нигде, кроме одного метода, где она только через atomic читается).

hamper ?
23.03.2018
17:27:29
Вот строчка в которой read at (первая строка) https://pastebin.com/BjJHC1gc

А в write строчка reqs = atomic.SwapUint64(&r.reqcnt, 0)

hamper ?
23.03.2018
17:30:27
_, err = redis.CounterIncr("key1."+key, 14*24*time.Hour) в read at

xPushkin
23.03.2018
17:30:40
_, err = redis.CounterIncr("key1."+key, 14*24*time.Hour) в read at
Ну и где тут чтение через атомик?

Конечно у вас будет race condition

hamper ?
23.03.2018
17:31:57
Ну там внутри CounterIncr вызывается функция в которой инкремент через atomic для r.reqcnt на своп которого ругается write

Daniel
23.03.2018
17:32:26
чтобы не ругалось - все чтения и все записи должны быть через атомик

hamper ?
23.03.2018
17:33:59
Читается оно тут https://pastebin.com/bUi01yqD

reqs = atomic.SwapUint64(&r.reqcnt, 0)

И это единственное место, где оно читается.

И вот именно на это место и ругается во write

xPushkin
23.03.2018
17:35:52
Выложите полный Warning Data Race

Google
hamper ?
23.03.2018
17:40:51
https://pastebin.com/HmFFss67 я пути только на *** заменил частично

/counters/counters.go:61 это как раз _, err = redis.CounterIncr("key1."+key, 14*24*time.Hour) а **/db/redis_main.go:24 это reqs = atomic.SwapUint64(&r.reqcnt, 0)

А содержимое CounterIncr я раньше присылал.

Вообще больше на false positive похоже, только непонятно почему, наверное забью пока на это. Я несколько раз код перечитал r.reqcnt снаружи читаться точно нигде не может, потому что приватное, а инкрементится оно только через atomic.AddUint64, просто странно.

Собственно вот весь модуль, внутри которого оно ругается, не знаю, где тут можно ошибиться https://pastebin.com/1vajH9S4

reqcnt и errcnt там больше нигде не используются

Roman
23.03.2018
17:54:44
ребят, как реализовать подобный барьер: типа "дамбы" которая блокирует всех "читающих" до того, как не дёрнут шлюз.. дёрнули шлюз - все горутины которые ждали - проходят, после чего шлюз снова закрывается и снова блокирует

m
23.03.2018
17:54:46
Вечер добрый. Я верно понимаю, что для того, чтобы отловить панику, нужно её ловить через defer в каждой запущенной горутине? Или достаточно в main.go прописать defer ?

Roman
23.03.2018
17:55:50
Вечер добрый. Я верно понимаю, что для того, чтобы отловить панику, нужно её ловить через defer в каждой запущенной горутине? Или достаточно в main.go прописать defer ?
если паника не будет словлена - он пойдёт вниз по стэку, таким образом её достаточно словить в самом нижнем, т.е. main

Roman
23.03.2018
17:56:26
ну - на каналах
да понятно.. но я голову уже второй час ломаю не могу никак на ноги поставить эту долбану дамбу

Daniel
23.03.2018
17:57:01
в горутины передаем канал каналов

Roman
23.03.2018
17:57:19
в горутины передаем канал каналов
честно говоря не понимаю

Daniel
23.03.2018
17:57:31
:)

m
23.03.2018
17:57:52
создаёшь канал, по которому отправляешь не , скажем строки, а другие каналы.

chan chan struct{}

Roman
23.03.2018
18:00:03
я не понимать ?

Google
Roman
23.03.2018
18:00:10
как из этого дамбу сделать

// block until background reconnection routine succeeds select { case err := <-clt.backgroundReconnection: // connected abort wait return err case <-time.After(timeout): // timeout, leave queue return webwire.ReqTimeoutErr{} }

вот тут все горутины ожидают пока шлюз (backgroundReconnection) откроется, либо пока им надоест и они сами выйдут с таймаутом

здесь я следственно закрываю канал close(backgroundReconnection) но проблема в том, что теперь то его переоткрывать надо...

m
23.03.2018
18:04:58
его переоткрывать надо где-то в другом месте. там где шлюзом управляют.

Daniel
23.03.2018
18:05:09
переоткрыть канал нельзя

можно только новый подсунуть

Roman
23.03.2018
18:05:20
и тут начинается геморой... это считай его нужно мьютексом защитить, но если рутины в очереди на него обретают shared lock то задедлочит горутина которая переоткрывает канал...

Admin
ERROR: S client not available

m
23.03.2018
18:05:22
всё верно

Daniel
23.03.2018
18:05:27
вот что

m
23.03.2018
18:05:32
не надо защищать

Daniel
23.03.2018
18:05:38
нам нужен атомик :)

ща, я набросаю экзампл

Roman
23.03.2018
18:06:22
не надо защищать
как не надо?! это читать и писать в канал - thread safe, а вот мутировать reference канала то надо синхронизировано

m
23.03.2018
18:06:26
вообще да, ещё один канал считать не выйдет. его же все считать придётся...

я думал, что не надо защищать, ибо прочто считается новый из канала.

Roman
23.03.2018
18:07:22
я думал, что не надо защищать, ибо прочто считается новый из канала.
здесь мы не каналом пользуемся, а переменной указателем на канал, которая никак не защищена от concurrent read/write

m
23.03.2018
18:07:25
с атомиком ждать не получится нормально

нужен ред-райт лок. Пока Lock() - все ждут. как сделали Unlock() , так все ждущие смогли взять Rlock() и потом соотвественно Runlock() по завершению делают.

Google
m
23.03.2018
18:09:54
потом как все сделали Runlock() , так дамба может закрыться , сделав Lock()

Roman
23.03.2018
18:10:21
нужен ред-райт лок. Пока Lock() - все ждут. как сделали Unlock() , так все ждущие смогли взять Rlock() и потом соотвественно Runlock() по завершению делают.
так я-ж уже написал, что это dead'лочит... т.е. для чтения из канала нам нужно получить shared lock, а для его "переоткрытия", т.е. пересоздания - exclusive lock, который невозможно обрести, когда в очереди уже ждёт "горутинная вода"

m
23.03.2018
18:12:10
так тебе из дамбы надо выпустить всю воду или как?

Roman
23.03.2018
18:13:01
так тебе из дамбы надо выпустить всю воду или как?
да, по сигналу выпустить всю воду что не ушла таймаутами, после чего закрыть шлюз и аккумулировать следующую воду до следующего сигнала

т.е. шлюз не закрывается (exclusive lock нужен) когда в него вода бьёт, ибо у воды shared lock

m
23.03.2018
18:15:21
т.е. ты видимо в цикле берёшь Rlock(), а тебе надо взять его один раз и потом ждать, что все его взяли и отпустили, что делается через WaitingGroup

Roman
23.03.2018
18:15:59
постой, это как?

waitgroup то тут чем полезен?

m
23.03.2018
18:21:15
в горутинах: wg.Add(1), mu.Rlock() , делаем что-то, mu.Runlock() , wg.Done(), wg.Wait() . в управляющей дамбой: for{ mu.Lock(), накапливаем, mu.Unlock() }

когда сработает последний mu.Runlock(), то найдётся ждущий mu.Lock() и он выполнится. Хотя я не даю 100% гарантии, что будет именно так всегда.

надо смотреть код Runlock. Он или передаёт управление горуитине ждущей лок или просто флажок снимает, что лок можно поставить. Но мне помнится, что передавал.

@onokonem , как считаешь?

wg и mu - в дамбе и горутинах одни и те же, если чё.

Daniel
23.03.2018
18:27:55
@onokonem , как считаешь?
пока ужинал - именно это и придумал :)

только зачем нужен лок?

m
23.03.2018
18:28:21
у меня после еды наоборот башка отключается ?

Daniel
23.03.2018
18:28:23
wg сама справится

m
23.03.2018
18:29:10
лок - чтобы все вместе стартовали.

в горутинах for{ wg.Add(1) // делаем что-то wg.Done() wg.Wait() } в дамбе: wg.Add(1) for{ wg.Done() // открываем дамбу wg.Wait() wg.Add(1) // закрываем дамбу // наполняем дамбу } wg.Done()

ты прав, лок не нужен.

Страница 1310 из 1674