Сигнал SIGHUP для перезагрузки конфигурации
SIGHUP — это сигнал, находящийся на стыке двух миров. Он возник из-за физического «обрыва» соединения с терминалом, и его изначальное значение — потеря управляющего терминала — актуально до сих пор.
Многие приложения, включая приложения на Go (по умолчанию), обрабатывают три сигнала для завершения работы: SIGTERM, SIGINT и SIGHUP. Среди них SIGHUP несет дополнительные нюансы и сегодня может иметь меньшее значение.
По определению:
Но что именно представляет собой «управляющий терминал»?
👉 Читать далее
👉 @juniorGolang | #cтатья
SIGHUP — это сигнал, находящийся на стыке двух миров. Он возник из-за физического «обрыва» соединения с терминалом, и его изначальное значение — потеря управляющего терминала — актуально до сих пор.
Многие приложения, включая приложения на Go (по умолчанию), обрабатывают три сигнала для завершения работы: SIGTERM, SIGINT и SIGHUP. Среди них SIGHUP несет дополнительные нюансы и сегодня может иметь меньшее значение.
По определению:
SIGHUP («signal hang up») — это сигнал, отправляемый процессу при закрытии его управляющего терминала. — Википедия
Но что именно представляет собой «управляющий терминал»?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤4
С помощью Go можно создавать и запускать последовательные программы, которые обмениваются данными друг с другом через каналы.
Однако поведение каналов по умолчанию — блокирующее, если нет данных для чтения:
Это полезно в сценариях, где нужно дождаться сигнала перед выполнением каких-либо действий (например, для корректного завершения работы). Но иногда требуется, чтобы часть программы одновременно слушала несколько каналов.
Если выполнение блокируется на первом канале, как оно узнает о сообщении во втором? Решением является мультиплексирование каналов, и в Go это делается с помощью ключевого слова
Ключевое слово
Вы можете явно блокировать выполнение или использовать
Предположим, у вас есть фоновый воркер, который, получив данные из очереди, должен выполнить некоторую операцию. Также вы хотите обрабатывать сигналы отмены и периодически чистить ресурсы, поскольку воркер работает в фоне.
В приведённом примере мы мультиплексируем каналы, чтобы добиться всего этого:
В первом
Внутри этого блока создаётся
Внутри
После завершения обработки (успешной или по тайм-ауту) вызывается
Далее мы пытаемся отправить результат в канал результатов, но с дополнительной защитой — мы не хотим блокироваться, если получатель не успевает обрабатывать данные.
Снова используется
Второй
Третий
Такой шаблон элегантно решает сразу несколько задач: обработку задач, учёт тайм-аутов, корректное завершение, доставку результатов и регулярное обслуживание — при этом предотвращая утечки ресурсов.
👉 @juniorGolang
Однако поведение каналов по умолчанию — блокирующее, если нет данных для чтения:
<-channel (будет ожидать, пока не появятся данные)Это полезно в сценариях, где нужно дождаться сигнала перед выполнением каких-либо действий (например, для корректного завершения работы). Но иногда требуется, чтобы часть программы одновременно слушала несколько каналов.
Если выполнение блокируется на первом канале, как оно узнает о сообщении во втором? Решением является мультиплексирование каналов, и в Go это делается с помощью ключевого слова
select.Ключевое слово
select в Go синтаксически похоже на оператор switch, но используется для мультиплексирования каналов, то есть для одновременного прослушивания нескольких каналов. Каждый case — это операция с каналом, при выполнении которой исполняется соответствующий блок кода (чтение из канала или запись в него).Вы можете явно блокировать выполнение или использовать
default-ветку, чтобы продолжить выполнение без блокировки.Предположим, у вас есть фоновый воркер, который, получив данные из очереди, должен выполнить некоторую операцию. Также вы хотите обрабатывать сигналы отмены и периодически чистить ресурсы, поскольку воркер работает в фоне.
В приведённом примере мы мультиплексируем каналы, чтобы добиться всего этого:
В первом
case мы получаем данные из очереди для дальнейшей обработки. Если канал закрыт — выходим из воркера.Внутри этого блока создаётся
context с тайм-аутом 30 секунд, который передаётся в функцию, обрабатывающую задачу с учётом тайм-аута. Это критически важно — так ни одна задача не сможет бесконечно блокировать воркер.Внутри
processWithTimeout() запускается горутина, выполняющая основную задачу, в то время как основная функция ожидает либо завершения работы, либо срабатывания тайм-аута. Для этого используется буферизированный канал для получения результата и select-оператор для обработки возможных ситуаций с тайм-аутом.После завершения обработки (успешной или по тайм-ауту) вызывается
cancel(), чтобы освободить ресурсы, связанные с контекстом. Даже если операция завершилась по тайм-ауту, явный вызов cancel() — это хорошая практика в Go для корректной очистки ресурсов.Далее мы пытаемся отправить результат в канал результатов, но с дополнительной защитой — мы не хотим блокироваться, если получатель не успевает обрабатывать данные.
Снова используется
select с default-веткой: если канал результатов переполнен, логируется предупреждение, и воркер сразу переходит к следующей задаче без ожидания. Такой неблокирующий подход предотвращает зависание воркера и позволяет ему продолжать работу даже при перегрузке получателя.Второй
case в основном select-блоке обрабатывает корректное завершение работы — при отмене родительского контекста воркер очищает ресурсы и завершает выполнение.Третий
case реализует периодическую проверку состояния (health check) каждые 5 минут бездействия. Это необходимо для выполнения обслуживающих задач, таких как очистка устаревших соединений, даже если нет новых задач.Такой шаблон элегантно решает сразу несколько задач: обработку задач, учёт тайм-аутов, корректное завершение, доставку результатов и регулярное обслуживание — при этом предотвращая утечки ресурсов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤6🔥3
Вышел Pion WebRTC v4.1.0 — стабильная поддержка полного AV1, передача больших сообщений через DataChannels и RTP-пейлоадер для H.265
https://github.com/pion/webrtc/releases/tag/v4.1.0
👉 @juniorGolang
https://github.com/pion/webrtc/releases/tag/v4.1.0
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
Release v4.1.0 · pion/webrtc
Pion v4.1.0
New release schedule – a fresh minor version will ship on the last weekend of every month.
AV1 support is complete and stable.
Data Channels now handle payloads larger than 65 535 byte...
New release schedule – a fresh minor version will ship on the last weekend of every month.
AV1 support is complete and stable.
Data Channels now handle payloads larger than 65 535 byte...
👍9❤2
Golang sync.Pool — не серебряная пуля
Когда речь заходит об оптимизации производительности в Go, sync.Pool часто выглядит как заманчивое решение. Он обещает сократить количество аллокаций памяти и снизить нагрузку на сборщик мусора за счёт повторного использования объектов. Но всегда ли это правильный выбор? Давайте углубимся в эту интересную тему.
👉 Читать
👉 @juniorGolang
Когда речь заходит об оптимизации производительности в Go, sync.Pool часто выглядит как заманчивое решение. Он обещает сократить количество аллокаций памяти и снизить нагрузку на сборщик мусора за счёт повторного использования объектов. Но всегда ли это правильный выбор? Давайте углубимся в эту интересную тему.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2🌭1
https://github.com/cristalhq/aconfig
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9
Отмена контекста в Go упрощает управление операциями корректным образом.
Один из часто используемых мной паттернов — это
Запускаешь задачу (например, фоновый воркер), и её можно отменить в любой момент.
Не нужно использовать сложные сигналы или вручную управлять флагами.
Запускаешь воркер, и когда программа получает сигнал завершения (Ctrl+C), контекст отменяется, и воркер корректно завершает работу.
Это один из самых надёжных способов остановки долго работающих задач по требованию.
👉 @juniorGolang
Один из часто используемых мной паттернов — это
context.WithCancel.Запускаешь задачу (например, фоновый воркер), и её можно отменить в любой момент.
Не нужно использовать сложные сигналы или вручную управлять флагами.
Запускаешь воркер, и когда программа получает сигнал завершения (Ctrl+C), контекст отменяется, и воркер корректно завершает работу.
Это один из самых надёжных способов остановки долго работающих задач по требованию.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤7
Реализация лимитера скорости с использованием Golang и Redis
В первой части этой статьи мы обсудим, почему отслеживание heartbeat-сигналов IoT-устройств критично важно и почему лимитирование запросов — это не просто полезная опция, а необходимое условие стабильности системы.
Во второй части мы перейдём к практике. Я построю рабочую систему отслеживания heartbeat-сигналов на Golang с использованием Redis, рассчитанную на распределённую архитектуру. Поехали.
👉 Читать
👉 @juniorGolang
В первой части этой статьи мы обсудим, почему отслеживание heartbeat-сигналов IoT-устройств критично важно и почему лимитирование запросов — это не просто полезная опция, а необходимое условие стабильности системы.
Во второй части мы перейдём к практике. Я построю рабочую систему отслеживания heartbeat-сигналов на Golang с использованием Redis, рассчитанную на распределённую архитектуру. Поехали.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤5🔥2
🔒 Безопасность: Включает исправление уязвимости в пакете
os (CVE-2025-22873).📢 Объявление: https://groups.google.com/g/golang-announce/c/UZoIkUT367A/m/5WDxKizJAQAJ
📦 Загрузка: https://go.dev/dl/#go1.24.3
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍4
AI-агент для Kubernetes с поддержкой искусственного интеллекта, который запускается в вашем терминале
https://github.com/GoogleCloudPlatform/kubectl-ai
👉 @juniorGolang
https://github.com/GoogleCloudPlatform/kubectl-ai
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🌚3🌭2
После 19 лет работы Иэн Лэнс Тейлор объявил об уходе из Google.
Большую часть этого времени он был ключевым участником команды разработчиков языка программирования Go.
Подробнее о его пути читайте здесь: https://airs.com/blog/archives/670
👉 @juniorGolang
Большую часть этого времени он был ключевым участником команды разработчиков языка программирования Go.
Подробнее о его пути читайте здесь: https://airs.com/blog/archives/670
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🤔6❤1
Корректное завершение работы (graceful shutdown) в Go — это тонкий процесс, требующий осторожности, чтобы избежать повреждения данных и плохого пользовательского опыта.
Это единственное руководство, которое вам нужно, чтобы овладеть этим процессом:
https://victoriametrics.com/blog/go-graceful-shutdown/
👉 @juniorGolang
Это единственное руководство, которое вам нужно, чтобы овладеть этим процессом:
https://victoriametrics.com/blog/go-graceful-shutdown/
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3
Автор книги «100 ошибок Go и как их избежать» признался, что даже не знал о возможности доступа к переменной
👍 — если знал об этом
🔥 — если стало открытием
👉 @juniorGolang
v в условии else-if:👍 — если знал об этом
🔥 — если стало открытием
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥72👍37😁13
Без использования CGo, кроссплатформенный GUI-инструментарий для Go
https://gitlab.com/cznic/tk9.0
👉 @juniorGolang
https://gitlab.com/cznic/tk9.0
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15❤5👍4🤔1
Директивы Go — это специальные комментарии, которые влияют на компилятор Go, компоновку (linking) и другие инструменты. Они позволяют добавлять метаданные или инструкции прямо в исходный код на Go.
Одна из особенно полезных директив —
Обычный сценарий использования — встраивание ресурсов веб-приложения (папка
На картинке приведён простой пример, как встроить папку
👉 @juniorGolang
Одна из особенно полезных директив —
//go:embed. Она позволяет встраивать статические ресурсы, такие как файлы или целые папки, непосредственно в скомпилированный бинарный файл Go, избавляя от необходимости отдельно развёртывать папки с ресурсами.Обычный сценарий использования — встраивание ресурсов веб-приложения (папка
assets, содержащая HTML, CSS, JavaScript). Эти ресурсы затем можно обслуживать напрямую с помощью стандартного пакета Go net/http.На картинке приведён простой пример, как встроить папку
web/dist, содержащую скомпилированные ресурсы SPA, и обслуживать ихPlease open Telegram to view this post
VIEW IN TELEGRAM
👍20❤7🔥2
Важные аспекты при использовании пакета
При работе со значениями времени в Go одной из самых распространённых операций является сравнение двух временных меток.
Однако эта на первый взгляд простая задача может привести к скрытым ошибкам, если не учитывать разницу между использованием оператора сравнения == и методом
👉 @juniorGolang
time в GoПри работе со значениями времени в Go одной из самых распространённых операций является сравнение двух временных меток.
Однако эта на первый взгляд простая задача может привести к скрытым ошибкам, если не учитывать разницу между использованием оператора сравнения == и методом
Equal()Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤3
Централизованная обработка HTTP-ошибок в Go
Статья от Алексиса Буше предлагает простой и эффективный способ централизовать обработку ошибок в HTTP-хендлерах на Go, чтобы избежать повторяющегося кода и улучшить читаемость.
Основная идея проста: изменить обработчики так, чтобы они возвращали ошибки, а не обрабатывали их напрямую.
Полный текст статьи с примерами кода доступен на сайте автора:
https://www.alexisbouchez.com/blog/http-error-handling-in-go
👉 @juniorGolang
Статья от Алексиса Буше предлагает простой и эффективный способ централизовать обработку ошибок в HTTP-хендлерах на Go, чтобы избежать повторяющегося кода и улучшить читаемость.
Основная идея проста: изменить обработчики так, чтобы они возвращали ошибки, а не обрабатывали их напрямую.
Полный текст статьи с примерами кода доступен на сайте автора:
https://www.alexisbouchez.com/blog/http-error-handling-in-go
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤4
Мощный уровень автоматизации, построенный поверх FFmpeg — разработан для того, чтобы сделать перекодирование видео и аудио проще, умнее и удобнее для интеграции.
https://github.com/welovemedia/ffmate
👉 @juniorGolang
https://github.com/welovemedia/ffmate
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3🤔1
Самая недооценённая суперспособность Go — это его парсерные пакеты:
На самом деле поразительно, насколько редко эти пакеты используются и обсуждаются.
По сути, ваш Go-код токенизируется и парсится компилятором для построения так называемого абстрактного синтаксического дерева (AST), чтобы затем скомпилироваться в промежуточное представление (IR), которое в дальнейшем переводится в машинный код.
Пакет
Прелесть в том, что это открывает потрясающие возможности для автоматизации шаблонного кода, ведь у вас буквально под рукой встроенный парсер языка!
Например, вы можете генерировать структуры DTO из моделей с JSON-тегами. Если бы вы попытались сделать это вручную, используя только условные операторы и циклы, ваш код был бы полон ошибок, а надёжная реализация потребовала бы создания полноценного парсера Go-кода. К счастью, в Go вы можете использовать стандартную библиотеку для разбора Go-файлов, извлечения всех типов и генерации DTO.
👉 @juniorGolang
go/parser, go/token и go/ast.На самом деле поразительно, насколько редко эти пакеты используются и обсуждаются.
По сути, ваш Go-код токенизируется и парсится компилятором для построения так называемого абстрактного синтаксического дерева (AST), чтобы затем скомпилироваться в промежуточное представление (IR), которое в дальнейшем переводится в машинный код.
Пакет
go/parser разбирает Go-код и позволяет корректно определить всё, что касается Go-файла: импорты, комментарии, функции, типы, переменные и многое другое.Прелесть в том, что это открывает потрясающие возможности для автоматизации шаблонного кода, ведь у вас буквально под рукой встроенный парсер языка!
Например, вы можете генерировать структуры DTO из моделей с JSON-тегами. Если бы вы попытались сделать это вручную, используя только условные операторы и циклы, ваш код был бы полон ошибок, а надёжная реализация потребовала бы создания полноценного парсера Go-кода. К счастью, в Go вы можете использовать стандартную библиотеку для разбора Go-файлов, извлечения всех типов и генерации DTO.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥4❤3🤯1
Обрабатывайте 8 байт за раз, используя старую технику под названием Simd Within a Register (SWAR), на Go
https://github.com/dans-stuff/swar
👉 @juniorGolang
https://github.com/dans-stuff/swar
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍3🔥2🏆1
Презентация «Что нового в Go» с конференции Google I/O 2025
https://youtu.be/kj80m-umOxs?si=dUG1XvFWuU5wNscN
👉 @juniorGolang
https://youtu.be/kj80m-umOxs?si=dUG1XvFWuU5wNscN
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4