
Alexander
11.10.2018
02:39:07
нет, не совсем правильно полагаешь

Евгений
11.10.2018
02:42:18
А как тогда? Есть еще package https://godoc.org/github.com/robfig/cron он в принцепе работает нормально, но хочется поменьше библиотек...
Темболее задачка наипростейшая

Alexander
11.10.2018
02:43:08
угу

Google

Daniel
11.10.2018
03:57:02
У таймера есть стоп и канал. Радость в том, что при стопе в канал уходит сообщение

Alexander
11.10.2018
03:59:10
Слушаю лекции про Go Васи Романова. Ничего так, нормально про Go рассказывает. про Go
https://www.youtube.com/watch?v=9Pk7xAT_aCU

Zver
11.10.2018
04:17:25

Pawel
11.10.2018
04:24:05

Vladimir
11.10.2018
04:36:01

Alexander
11.10.2018
06:03:56

Vladimir
11.10.2018
06:04:30

Alexander
11.10.2018
06:10:14

Marlik
11.10.2018
06:30:49
А какие есть распространённые практики использования http.Handle и http.HandleFunc? Я так понимаю, первое гибче, но не работает с роутами горилы ибо оно требует второе. Есть какие-то трюки юзать горилу с первым вариантом?

Мерлин
11.10.2018
06:44:45

Marlik
11.10.2018
06:45:11

Google

Евгений
11.10.2018
06:47:15

Мерлин
11.10.2018
06:52:30
Спасибо, пошёл читать.
а так http.Handle и http.HandleFunc полностью взаимозаменемы
https://play.golang.org/p/c9h4-lEn1tR

Marlik
11.10.2018
06:53:14

Евгений
11.10.2018
06:54:31

Vladimir
11.10.2018
07:01:03

Евгений
11.10.2018
07:03:04
Хорошо как тогда правельно ее реализовать?

Vladimir
11.10.2018
07:03:58
рутина должна сообщить основному потоку main о своем завершении , думай как
завершение основного потока main - ЗАВЕРШЕНИЕ ПРОГРАММЫ

Евгений
11.10.2018
07:05:30
Ну хоть какой-то пример выхода из данной ситуации?
То-есть насколько я понял что проблема зависания в:
func init() {
go SessionCleanupTask() // Тут?
}
???

Paul
11.10.2018
07:07:28
В главной когртине обрабатывай сигналы SIGTERM, SIGKILL SIGINT, по сигналу делаешь отмену контекста и ждёшь вейтгруппу

Vladimir
11.10.2018
07:08:48
если хочешь в рутине ожидать , туда нужно параметром отправить канал завершения то есть тот канал по которому рутина пошлет сигнал о своем завершении

Savely
11.10.2018
07:10:50
ребзя, а кто что юзает из орм-ок разряда sql-first?
у меня тут сейчас прод на code-first orm-ке написан, по классике со временем не находили нужного в итоге весь код адская каша из orm и rawquery
gorm юзал, но как-то хз, не очень зашел

Евгений
11.10.2018
07:12:59

Savely
11.10.2018
07:13:58

Vladimir
11.10.2018
07:16:07

Google

Евгений
11.10.2018
07:16:49
Просто задача тривиально простая для модуля на любом языке программирования - запустил поток, в данном случае рутну и через каждую минуту вычищаешь из массива старые данные
ну и проверяешь состояние процесса на предмет завершения...
Нее os.Exit вообще не вариант...

Vladimir
11.10.2018
07:20:12
сколько раз ты использовал os.Exit чтобы выйти из Golang приложения по Ctrl+C?

Daniel
11.10.2018
07:20:40

Vladimir
11.10.2018
07:22:05

Savely
11.10.2018
07:23:36

Daniel
11.10.2018
07:23:36

Savely
11.10.2018
07:23:45
Не работал с gcp

Daniel
11.10.2018
07:23:53

Vladimir
11.10.2018
07:25:04

Savely
11.10.2018
07:25:26
вся логика в пакетах

Vladimir
11.10.2018
07:25:51

Daniel
11.10.2018
07:26:17
Что-то, что мы не контролируем
Гугл-клауд, в отличие от большинства "облаков" - настоящее облако.

Vladimir
11.10.2018
07:27:17
и это ЧТО-ТО мы должны остановить п Ctrl+C

Евгений
11.10.2018
07:27:37
Вот код:
package authHook
func SessionCleanupTask() {
var quit = make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) // kbdloss,ctrl+c,terminate,quit
defer log.Printf("quit=%v\n", quit)
for {
select {
case <-quit: // ———————————- В этом месте он должен реагировать на CTRL+C и.т.д.
return
case <-time.After(time.Minute): //————————— В этом он делает свои дела каждые 1 минуту
log.Println("peek: SessionCleanupTask")
}
}
}
func init() {
go SessionCleanupTask()
}
Ожидаемые результат - нажимаешь Ctrl+С. и как он попадает на обработчик case <-quit: он спокойно выходит из фунции своим ходом без костылей

Google

Daniel
11.10.2018
07:28:08
Я бы хотел понять, как мы передадим ctrl-c в облако

Vladimir
11.10.2018
07:28:37
да клавиатура там виртуальная?

Savely
11.10.2018
07:28:44

Daniel
11.10.2018
07:28:44
Нету

Евгений
11.10.2018
07:29:18
Товарищи не подскажите как кильнуть time.Sleep(time.Until(nextExecute)) ?
А то после CTRL+C приложение еще может минуту висеть пока SIGINT дойдет....?
func SessionCleanupTask() {
var quit = make(chan os.Signal)
signal.Notify(quit, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) // kbdloss,ctrl+c,terminate,quit
for {
select {
case <- quit:
return
default:
nextExecute := time.Now().Add(time.Minute)
time.Sleep(time.Until(nextExecute))
log.Println("peek: SessionCleanupTask")
}
}
}
func init() {
go SessionCleanupTask()
}
обычно этот канал делают буферизованным, чтобы не блокировать обработчик сигнала. Тогда он сможет записать сигнал вне зависимости от того, кто-то готов его сейчас вычитать или нет. Иначе он может заблокроваться на записи - неххорошо, Ось подумает,
что ее игнорируют.
var quit = make(chan os.Signal, 1)
^^^

Admin
ERROR: S client not available

Евгений
11.10.2018
07:30:02

Daniel
11.10.2018
07:30:53

Vladimir
11.10.2018
07:32:31
сорьки вы изобрели новый тикер? Теперь н не ждет минуту?
case <-time.After(time.Minute): //————————— В этом он делает свои дела каждые 1 минуту
log.Println("peek: SessionCleanupTask")

Artem
11.10.2018
07:34:06

Savely
11.10.2018
07:34:18
а что за таск вообще? грейсфулл шатдаун в контексте google cloud platform?

Vladimir
11.10.2018
07:36:04

Artem
11.10.2018
07:36:40
https://golang.org/pkg/time/#After вот как раз тот самый пример, что парень сделал
так что всё ок, расходимся

Zver
11.10.2018
07:40:03

Daniel
11.10.2018
07:40:53
Надо лучше читать документацию :)
Но там и правда мутный момент
Доберусь до компа - напишу

Zver
11.10.2018
07:46:06

Daniel
11.10.2018
08:04:10
так вот, обычно эта констркуция не применима и не нужна
обычно как:
где-то на чтении из t.C висит горутина
вы делаете t.Stop(), в t.C уезжает значение
которое та, висящая горутина, и вычитывает
и когда запускается ваше чтение из t.C - он уже пуст, и в нем точно ничего не появится
использовать эту конструкцию - и об этом есть в доке - надо ТОЛЬКО если вы точно знаете, что читать из t.C некому

Google

Daniel
11.10.2018
08:04:35

many-faced
11.10.2018
08:11:11
Народ, всем дорое утро.
Подскажите, как в go при отсутствии наследования решается проблема отсутствия наследования? =)
Например, я хочу объект db с методом Connect, CreateTable, Insert, итд,
А в других пакетах на него подвешивать более высокоуровневые штуки типа GetUsers, GetProducts, итд?

Daniel
11.10.2018
08:11:50
именно эта проблема разрешается встраиванием

John
11.10.2018
08:11:58
Народ, всем дорое утро.
Подскажите, как в go при отсутствии наследования решается проблема отсутствия наследования? =)
Например, я хочу объект db с методом Connect, CreateTable, Insert, итд,
А в других пакетах на него подвешивать более высокоуровневые штуки типа GetUsers, GetProducts, итд?
В го есть композиция, вот её и используй

Евгений
11.10.2018
08:12:11

Daniel
11.10.2018
08:12:34
объекты, конечно, есть

Евгений
11.10.2018
08:12:41
структуры?
с приаттаченными функциями

Daniel
11.10.2018
08:12:56
экземпляры типов, если быть точным

Евгений
11.10.2018
08:18:01

Daniel
11.10.2018
08:19:25
почему странное? powerman автор

Мерлин
11.10.2018
08:24:04

many-faced
11.10.2018
08:27:13

Евгений
11.10.2018
08:35:10

Denis
11.10.2018
08:36:40
Коллеги, есть приглашение на Хакатон на Go в Европе, можно запостить сюда? возможно тут кто-то будет в соответствующих городах

Vladimir
11.10.2018
08:37:51
Ребят, а как апдейтнуть отдельные поля в хэше редисе (через HMSET) с помощью redigo/redis?