
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

Roman
17.04.2018
20:41:47

Makkusu
17.04.2018
20:42:10

Roman
17.04.2018
20:42:31

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:53:44

Roman
18.04.2018
00:55:05

Roman
18.04.2018
00:57:43

Roman
18.04.2018
00:59:53
это способ безопасной коммуникации гоферов)) т.е. горутин

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

Roman
18.04.2018
01:03:39

Roman
18.04.2018
01:04:57

Roman
18.04.2018
01:05:47

Roman
18.04.2018
01:07:20

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

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

Roman
18.04.2018
01:15:06

Roman
18.04.2018
01:15:40

Roman
18.04.2018
01:17:52

Roman
18.04.2018
01:19:04

Roman
18.04.2018
01:19:52

Roman
18.04.2018
01:21:00

Roman
18.04.2018
01:21:32

Roman
18.04.2018
01:22:13

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
мьютекс это примитив синхронизации... если мы делим один мап меж несколькими потоками то их надо синхронизировать

Roman
18.04.2018
01:28:35

Google

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

Roman
18.04.2018
01:30:15

Roman
18.04.2018
01:30:56

Roman
18.04.2018
01:31:23

Roman
18.04.2018
01:32:07

Roman
18.04.2018
01:33:27

Roman
18.04.2018
01:34:04

Admin
ERROR: S client not available

Roman
18.04.2018
01:37:41

Roman
18.04.2018
01:39:36

Roman
18.04.2018
01:40:21

Roman
18.04.2018
01:41:14

Roman
18.04.2018
01:42:35

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

Roman
18.04.2018
01:55:10

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

Roman
18.04.2018
01:59:58

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

Roman
18.04.2018
02:02:25

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
Шлялся всю ночь где-то, теперь удивляется, что домой не пускают.