Как делается демонизация?

90 views
Skip to first unread message

Inno Bragovich

unread,
Mar 28, 2018, 2:54:30 PM3/28/18
to Golang Russian
Доброго дня!

Коллеги, можете что-либо посоветовать по поводу того, как правильно организовать постоянно работающе приложение?

Есть функция, котора выполняет запрос POST и сохраняет результат.  Нужно сделать так, чтобы выполнялась постоянно (каждые столько-то секунд).

На данный момент я сделал так:

type MyStruct struct {
isEnabled bool
//...
}

func (m *MyStruct) GetData() {...} // однократное получение данных

func (m *MyStruct) Start(){
m.isEnabled = true
    go func(m *MyStruct){
for m.isEnabled {
            m.GetData()
            // ... 
           time.Sleep(time.Duration(500) * time.Millisecond)
}
    }(m)
}

func (m *MyStruct) Stop() {
m.isEnabled = false
}


Я хочу, чтобы в main.go я написал m.Start(), и стартовала рутина работать, пока в main.go далее где-то не встретится m.Stop(), или вообще работала всегда, если m.Stop() не встретился.
Однако, если мы запишем просто m.Start(), он выключется, не дождавшись завершения рутины. А писать вейтгруппу и запуск m.GetData в рутине в main.go - как-то некрасиво.

Andrey Velikoredchanin

unread,
Mar 28, 2018, 3:03:22 PM3/28/18
to golang-ru
"Правильно" - понятие растяжимое. Лично для себя я наш наиболее правильный способ через модуль github.com/VividCortex/godaemon. Хотя, некоторым и он кажется не совсем правильным.

28 марта 2018 г., 21:54 пользователь Inno Bragovich <innobr...@gmail.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+unsubscribe@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Daniel Podolsky

unread,
Mar 28, 2018, 5:10:28 PM3/28/18
to gola...@googlegroups.com
WaitGroup it is



--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.

Виталий Осипов

unread,
Mar 29, 2018, 1:14:32 AM3/29/18
to Golang Russian
Попробуй использовать каналы.
Запускаешь горутину, она помимо выполнения основной задачи слушает канал и при поступлении сигнала прекращай работу.
Для таймера рекомендую использовать time.Tick и основной цикл сделать след. образом:

for {
   select {
   ...
  }
}

среда, 28 марта 2018 г., 23:54:30 UTC+5 пользователь Inno Bragovich написал:

Евгений Д

unread,
Mar 29, 2018, 4:20:19 AM3/29/18
to Golang Russian
для этой цели канал достаточно закрыть
мне более правильным видится подход с использованием пакета context. при использовании канала не получиться прервать выполнение вложенных вызовов, например http-запрос или запрос в БД.

четверг, 29 марта 2018 г., 12:14:32 UTC+7 пользователь Виталий Осипов написал:

Inno Bragovich

unread,
Mar 29, 2018, 9:38:33 AM3/29/18
to Golang Russian
On Thursday, March 29, 2018 at 8:14:32 AM UTC+3, Виталий Осипов wrote:
Попробуй использовать каналы.
Запускаешь горутину, она помимо выполнения основной задачи слушает канал и при поступлении сигнала прекращай работу.

У меня с каналами туго ) можешь показать, что ты имеешь ввиду?
 
Для таймера рекомендую использовать time.Tick 

А как оно себя будет вести, если тик будет по времени меньше операции в нём?
Может, sleep гарантированнее? 

Виталий Осипов

unread,
Mar 30, 2018, 2:10:40 AM3/30/18
to Golang Russian
func funcRequest(chanInput chan struct{}, d time.Duration) {
t := time.NewTimer(d)
for {
select {
case <-chanInput:
return
case <-t.C:
// вызов чего-либо
t = time.NewTimer(d)
}
}
}

func main() {
var chanInput chan struct{}
go funcRequest(chanInput, 128*time.Second)

// Делаешь что-либо,
// когда надоест ...

chanInput = <-struct{}{}
}



код не проверял, это на тебя возлагается :)

четверг, 29 марта 2018 г., 18:38:33 UTC+5 пользователь Inno Bragovich написал:

Inno Bragovich

unread,
Mar 30, 2018, 4:32:23 AM3/30/18
to Golang Russian
Спасибо, сегодня-завтрта отпишусь о результатах.
Reply all
Reply to author
Forward
0 new messages