Anonymous
Anonymous
Или по сохранению файла?
heavycharged
heavycharged
тот же goland когда шаблоны редактируешь, то не видно изменений, потом возвращаешься, ctrl+s и вуаля
heavycharged
да, она запускается, и крашится. иногда даже вылазит терминал с кучей ошибок)
heavycharged
но это как настроишь)
Anonymous
Хехе, и это всё на продакшен сервере 👌
Anonymous
но в целом я понял общую концепцию, благодарю за ответы
Anonymous
Anonymous
да да, меня ввело в заблуждение что запуск быстро происходит… вероятно это из-за того что на простом коде тренировался, на больших проектах так не работает
heavycharged
из-за строгой статической типизации, здесь о 95% всех ошибок сообщит IDE, остальное всякие nil dereference и ошибки в логике, не то сунули, не туда, и т.д. так что в целом, билдить на каждой правке тут нету необходимости. во всяком случае, я когда рефакторю, то почти сразу все стартует как нужно.
Denis
есть https://github.com/nathany/looper которая перезапускает тесты на каждое сохранение файла, удобная штука
.
Ребят
.
Какие есть хорошие варианты лога запросов net/http?
.
Мне чисто в консольку
heavycharged
.
Ну без всяких функций
Anonymous
.
нет
.
мне чисто для бенча
.
так как Apache AB нифига не показывает толком
Anonymous
Без функций не получится
Хотя бы fmt println
heavycharged
запросы то входящие или исходящие?
.
Я хочу знать с каким кодом возвращаются ответы
.
.
или исходящие
.
Короче
.
Мне просто надо знать с каким кодом возвращаются запросы
.
И чтобы это чисто в консоль
heavycharged
ну миддлвер тебе нужно, если запросов много..
там же просто его сделать, это самый простой путь
heavycharged
попробуй siege юзай, или JMeter
heavycharged
они пишут сколько запросов с каким статусом
heavycharged
зачем тебе в приложухе логировать это дело, у тебя ещё сильнее упадет производительность из-за этого
.
Понял
.
https://github.com/codesenberg/bombardier
.
А про это что скажете?
.
для теста
Anatoliy
А есть тут люди что ботов телеграмных писали?)
Интересует вопрос - как отлавливать нажатия кнопок? Пользуюсь https://github.com/go-telegram-bot-api/telegram-bot-api
Сами кнопки тоже отрисовываются, а вот нажатия отловить на них не могу 😩
Anonymous
Anonymous
Anatoliy
Anonymous
Anonymous
Надо ловить
Anatoliy
Там callback
msg := tgbotapi.NewMessage(upd.Message.Chat.ID, upd.Message.ReplyToMessage.Text)
data := fmt.Sprintf("%d-1",upd.Message.ReplyToMessage.MessageID)
data2 := fmt.Sprintf("%d-2",upd.Message.ReplyToMessage.MessageID)
btn1 := tgbotapi.InlineKeyboardButton{
Text: "+",
CallbackData: &data,
}
btn2 := tgbotapi.InlineKeyboardButton{
Text: "-",
CallbackData: &data2,
}
nikr := tgbotapi.NewInlineKeyboardRow(btn1, btn2)
msg.ReplyMarkup = tgbotapi.NewInlineKeyboardMarkup(nikr)
bot.Send(msg)
Вот собственно сами кнопки с сообщением
Anatoliy
А вот пытаюсь отловить Callback:
if update.CallbackQuery != nil {
logger.Info("CallbackQuery")
logger.Info(update.CallbackQuery)
И он не отлавливается вообще
Anonymous
Anonymous
Anatoliy
Просто стандартное
if update.Message == nil {
continue
}
зло :)
.
хорошая штука или нет?
.
https://github.com/codesenberg/bombardier
Wingman
Подскажите пожалуйста. Принципиально не вдупляю в некоторые базовые штуки с select/chan/таймаут, etc.
Пример прерывания некоего процесса по таймауту, как его в куче мест приводят:
`
for {
select {
case <-time.After(300 * time.Second):
return
default:
сделать_что-то_долгое()
}
}
`
Вроде как по наступлении таймаута через 5 минут цикл должен прерваться.
Но ведь если сразу после запуска процесс у меня попадёт в default, и там будет выполнять что-то долгое/подвисшее 10, например, минут, то до первого case дело не дойдёт, пока это что-то не выполнится? Получается, что от такого таймаута толку мало?
Не понимаю :(
heavycharged
в данном примере, да, смысла мало
heavycharged
что-то большое нужно дробить на что-то маленькое
Wingman
печаль
Wingman
а если вдруг что-то, от нас не зависящее, но время ожидания чего нужно ограничить? :)
Anonymous
heavycharged
нужно делать done chan struct{}, который мы закрываем по прошествии 5 минут, а в самой долгой задаче, если там идут всякие for, делаешь так
for _, i := range some {
select {
case <-done:
return
default:
// обрабатываем
}
}
Wingman
гмгм
heavycharged
https://blog.golang.org/pipelines
heavycharged
вот тут более подробно
heavycharged
суть в том, что из закрытого канала чтение происходит мгновено и бесконечно, а значение возвращается нулевого типа, получается что если ты попадаешь на закрытый канал, то значение читается мгновено, попадает на нужный case <- done после чего делает return
Wingman
нужно делать done chan struct{}, который мы закрываем по прошествии 5 минут, а в самой долгой задаче, если там идут всякие for, делаешь так
for _, i := range some {
select {
case <-done:
return
default:
// обрабатываем
}
}
Ну это если там есть всякие for.
Ну вот чуть менее абстрактный пример: я телнечусь на оборудование, отправляю команду, иииии жду вывода - ничего больше сделать не могу. Предположим, что в телнет-клиенте нет встроенных таймаутов (ну просто для примера ведь). Тогда получается, что мы зависли в default:, если ожидаем в нём данных от железки, и прервать это ожидание извне никак нельзя
heavycharged
ну у тебя в отдельной горутине это все происходит?
Wingman
угу
Wingman
heavycharged
сек, сейчас попробую что-то придумать..
heavycharged
чтобы показать как это дело обыграть правильно
heavycharged
heavycharged
первая горутина, та часть где default - это твоя долгоиграющая задача... которая тоже в горутине должна запускаться, и должна вызвать close(ready) когда все будет готово.
heavycharged
или через 20 секунд будет close(done), и тогда эта же горутина должна написать в ту, чтобы та сделала return
heavycharged
в целом, если у тебя прямо в коде for {} и не предусмотрено механизм прерывания, то никак ты из него не выйдешь, по крайней мере я не знаю таких способов
heavycharged
Wingman
Wingman
https://play.golang.org/p/12iTQNY7dEI
что-то типа такого