@proGO

Страница 1377 из 1674
Roman
17.04.2018
20:38:37
короче заблокировали всё, но телега работает... о боже...

Здравствуйте! Можете помочь?
задавай вопрос, не стисняйся)

Makkusu
17.04.2018
20:39:07
не окончательно пока
Вы просто опытный разработчик

у меня тг тоже лагает

Google
Makkusu
17.04.2018
20:39:30
задавай вопрос, не стисняйся)
Как правильно слайс структур вытаскивать из горутин?

Marlik
17.04.2018
20:39:34
Пока вот так, я думаю они по домам пошли, с утра опять начнётся.



Roman
17.04.2018
20:40:03
Как правильно слайс структур вытаскивать из горутин?
пардон?.. не понял вопрос честно говоря) больше подробностей

Makkusu
17.04.2018
20:40:22
Сейчас делаю так в цикле v, ok := <- chStructs if ok { products = append(structs, v...) } else { break }

Roman
17.04.2018
20:40:30
п*здец, еб@нулись на всю голову

Makkusu
17.04.2018
20:40:46
пардон?.. не понял вопрос честно говоря) больше подробностей
Пытаюсь многопоточно парсить данные с api

Roman
17.04.2018
20:41:47
Пытаюсь многопоточно парсить данные с api
понятно, т.е. тебе нужно запустить парочку горутин, дать им данные а потом получить обработанные из всех и собрать вместе?

Roman
17.04.2018
20:42:31
типо того GET запросами
рутины сами делают запросы?

Makkusu
17.04.2018
20:42:40
да

Roman
17.04.2018
20:43:05
честно говоря я представляю себе решение легче с mutex'ом нежели каналом

написать структуру с методом Add(result) которая защищает некий слайс результатов мьютексом

Google
Roman
17.04.2018
20:43:53
при завершении обработки запроса worker горутина просто вызывает этот метод

type Results struct { results []string lock sync.RWMutex } func NewResults() *Results { return &Results{ results: make([]string, 0), lock: sync.RWMutex{}, } } func (res *Results) Add(newResult string) { res.lock.Lock() res.results = append(res.results, newResult) res.lock.Unlock() } // Returns all accumulated results and empties the buffer func (res *Results) Flush() []string { res.lock.RLock() defer res.lock.RUnlock() return res.results } func worker(results *Results) { // http.Get(...) results.Add("newResult") } func aggregator(results *Results) { for _ := range results.Flush() { // process } } func main() { results := NewResults() for i := 0; i < 16; i++ { go worker(results) } go aggregator(results) }

что-то в этом роде

хмм, как лучше смоделировать структуру для определения резервации тренера по времени?

isTrainerReserved(trainerId, beginTime, endTime)

вот есть у нас тренер, у него могут быть appointment'ы с клиентами. У каждого appointment'а есть время начала и время конца. Какая структура лучше справится с подобной задачей?

Dmitry
18.04.2018
00:41:01
очередь ? мимопроходил

Roman
18.04.2018
00:55:05
такой подход в том или ином виде почти на любом ЯП можно сделать, интересно, как оптимальнее и правильнее в Go?
а чем сия конструкция неправильна?) да, в Go есть каналы, но они не всегда лучше старых добрых mutex'ов))

Roman
18.04.2018
00:57:43
а чем сия конструкция неправильна?) да, в Go есть каналы, но они не всегда лучше старых добрых mutex'ов))
у меня недостаточно опыта в Go, чтобы делать выводы. зачем вообще каналы, если есть мьютексы?

Roman
18.04.2018
00:59:53
у меня недостаточно опыта в Go, чтобы делать выводы. зачем вообще каналы, если есть мьютексы?
каналы зачастую легче читаются, но не в каждом случае. по сути каналы можно ассоциировать с трубами. Канал это труба в которую гофер (горутина) может что-то положить или из неё что-то взять.

это способ безопасной коммуникации гоферов)) т.е. горутин

Roman
18.04.2018
01:01:39
тогда можно сказать, что любое даже самое маленькое приложение может расти и та структура с мьютексом будет усложняться. и как бы через года не стала проблемой, каналы сложнее "обслуживать", но зато они изолируют горутины

Roman
18.04.2018
01:03:39
тогда можно сказать, что любое даже самое маленькое приложение может расти и та структура с мьютексом будет усложняться. и как бы через года не стала проблемой, каналы сложнее "обслуживать", но зато они изолируют горутины
каналы неудобны тогда, когда действительно нужно именно "делить" данные меж несколькими горутинами а не коммуницировать меж ними. нет ничего плохого в thread safe структуре, которая внутри себя использует мьютекс, с условием что эта структура занимается только узким спектром задач

Roman
18.04.2018
01:05:47
вопрос в том, будет ли соблюдаться это условие в будущем. обычно над кодом работает больше 1 программиста
это 2 разные парадигмы, каналы = communication, мьютекс = shared mutable state. Для разных проблем разные инструменты

Roman
18.04.2018
01:07:20
это 2 разные парадигмы, каналы = communication, мьютекс = shared mutable state. Для разных проблем разные инструменты
допустим, вам нужно делать проверку на дубликаты перед запросом, чтобы не делать лишнюю работу. нужен еще 1 лок?

Zver
18.04.2018
01:07:32
Ну канал это тоже мютексты мютексы.

Roman
18.04.2018
01:09:03
Ну канал это тоже мютексты мютексы.
канал это примитива коммуникации, которая внутри своей имплементации использует мьютекс, ибо коммуникация это абстракция над shared state'ом

Google
Zver
18.04.2018
01:09:31
Если есть поток данных, то каналы, если общее хранилище, то мютексты или атомики.

Roman
18.04.2018
01:12:31
Ну поэтому тут думать о том что использовать как то и не возникает вопросов.
как я уже сказал - каналы подходят только для коммуникации, если речь идёт о shared state'е то зачастую удобнее работать atomic'ами и mutex'ами

Roman
18.04.2018
01:13:52
не понял вопрос чес гря
вы делаете Get запрос по набору урлов. там могут быть дупликаты. вы будете делать несколько запросов к одному и тому же урлу?

Roman
18.04.2018
01:15:06
Roman
18.04.2018
01:15:40
может сначала избавиться от дубликатов в списке из которого читаем?
предположим, это невозможно, потому что они читаются из потока и их 1 миллиард

Roman
18.04.2018
01:17:52
предположим, это невозможно, потому что они читаются из потока и их 1 миллиард
ну это сильно зависит от... от много чего)) если так надо предотвращать повторные запросы то можно написать небольшую структурку в которой map и метод IsNew(url), всё это внутри защитить мьютексом и вуаля)

Roman
18.04.2018
01:19:52
хорошо. бывает Гет запросы приходят с ошибкой. и нужно сделать повторный запрос через минуту. понимаете, к чему клоню?
в чём проблема? добавляешь метод Reset(url) который вызывается в случае ошибки и норм)

Roman
18.04.2018
01:21:00
в чём проблема? добавляешь метод Reset(url) который вызывается в случае ошибки и норм)
еще мьютекс. и логика, сколько уже методов в вашей структуре на данный момент? 8 и 3 мьютекса?

Roman
18.04.2018
01:22:13
2 метода и 1 мьютекс
мы же добавили IsNew и Reset как минимум

Roman
18.04.2018
01:22:32
в каждом из них по мьютексу

или вы хотите все блочить 1 мьютексом?

предполагаю что IsNew и Reset не пришли одни и еще притащили с собой методов для обработки чего нибудь внутри структуры. ведь теперь еще есть "таймер" который через минуту запустит Урл с ошибкой еще раз

Roman
18.04.2018
01:26:28
еще мьютекс. и логика, сколько уже методов в вашей структуре на данный момент? 8 и 3 мьютекса?
type UrlRegistry struct { urls map[string]struct{} lock sync.Mutex } func NewUrlRegistry() *UrlRegistry { return &UrlRegistry{ make(map[string]struct{}) sync.Mutex{}, } } // IsNew returns true if the given url was already checked, otherwise returns false and immediately registers the new url func (reg *UrlRegistry) IsNew(url string) bool { reg.lock.Lock() defer reg.lock.Unlock() if _, exists := reg.urls; !exists { req.urls[url] = struct{} return false } return true } // Reset removes the given url from the registry func (reg *UrlRegistry) Reset(url string) { reg.lock.Lock() req.lock.Unlock() delete(reg.urls, url) }

Roman
18.04.2018
01:27:12
понимаете, чем плохо лочить все приложение 1 мьютексом?

Roman
18.04.2018
01:27:55
понимаете, чем плохо лочить все приложение 1 мьютексом?
а вы понимаете что лочить один мап двумя мьютексами убивает смысл мьютексов создавая опасность data race'а?

мьютекс это примитив синхронизации... если мы делим один мап меж несколькими потоками то их надо синхронизировать

Google
Roman
18.04.2018
01:29:02
плюс на каналах будет скорее всего медленее

Roman
18.04.2018
01:30:15
плюс на каналах будет скорее всего медленее
скорее всего, 1 мьютекс будет сильно бить по производительности, потому что вы не можете сделать ничего пока не захватите лок

Roman
18.04.2018
01:31:23
ну и как ты это напишешь на каналах?
есть горутина, есть канал. горутина делает запрос, пишет в канал, вы его читаете

Roman
18.04.2018
01:32:07
Roman
18.04.2018
01:33:27
и чем это отличается от примера со структурой?
отсутсвие опасности race при сохранении гибкости. вы можете создавать сотни каналов, не парясь о том, кто и как захватывает блокировки внутри них. ведь так?

Admin
ERROR: S client not available

Roman
18.04.2018
01:37:41
Roman
18.04.2018
01:40:21
так, постой, у тебя же Cache почти то-же самое что у меня тот пример выше?!
почти. только у меня 1 мьютекс, который блочит перед запросом. и больше локов не нужно

Roman
18.04.2018
01:42:35
ну так это 1 в 1 тоже самое что и я написал
нет, ты лочишь на каждое действие, потому что тебе приходится самому все синхронизировать, у меня каналы делают эту работу

Roman
18.04.2018
01:43:30
правда ты тут нарушил принцип энкапсуляции и распределил ответственность модулей неправильно, одну минуту

Roman https://play.golang.org/p/Dw4rc0gEdFp

переместил логику cache'а в сам кэш, а наружу удобный API, ибо иначе нарушается принцип энкапсуляции

Roman
18.04.2018
01:50:28
Roman
18.04.2018
01:51:15
кстати "регистр" более правильное название нежели кэш, кэш это про другое совсем)

Google
Roman
18.04.2018
01:51:46
ты так-же лочишь при чтении visited перед каждым запросом

Roman
18.04.2018
01:53:34
ты так-же лочишь при чтении visited перед каждым запросом
но не лочу для записи. и для всех последующих возможных действий над регистром

Roman
18.04.2018
01:55:10
но не лочу для записи. и для всех последующих возможных действий над регистром
здрасьте, это как это не лочишь для записи, а в Visited тогда что происходит?

Roman
18.04.2018
01:55:49
все данные стекаются в канал - можно продолжать с ними что то делать без локов

они конечно лочатся локально и на короткий период времени, но это уже внутренние дела каналов

Roman
18.04.2018
01:58:07
они конечно лочатся локально и на короткий период времени, но это уже внутренние дела каналов
а зачем они тогда вообще лочатся если они живут в контексте одной горутины?

Roman
18.04.2018
01:58:26
в решение с 1 мьютексом могут возникнуть ситуации, когда сотни горутин ожидают лока

а зачем они тогда вообще лочатся если они живут в контексте одной горутины?
это внутреннее устройство каналов, не нашего ума дела в данном случае, считай, что ты создал сотни мьютексов, чтобы поддерживать синхронность данных

Roman
18.04.2018
01:59:27
в решение с 1 мьютексом могут возникнуть ситуации, когда сотни горутин ожидают лока
зачем лочить state, который живёт в пределах одной горутины?

Roman
18.04.2018
01:59:58
зачем лочить state, который живёт в пределах одной горутины?
он же "глобальный" - передается по указателю

Roman
18.04.2018
02:00:46
он же "глобальный" - передается по указателю
тогда это по прежнему один мьютекс, ибо канал внутри использует мьютекс. пока в него пишет или из него читает одна из горутин - все остальные стоят и ждут

в конкурентном программировании либо shared state который нужно синхронить в контексте всех потоков, либо локальные копии в стэках потоков

Roman
18.04.2018
02:02:41
тогда ничем в данном случае канал не лучше

это такой-же мьютекс

Zver
18.04.2018
04:48:07
Все спят?

Olzhas
18.04.2018
04:49:44
Все спят?
не могут в телеграм зайти

Zver
18.04.2018
04:51:37
Не надо было выходить.

prospero78su
18.04.2018
04:58:57
Шлялся всю ночь где-то, теперь удивляется, что домой не пускают.

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