• Когда использование Cgo оправданно?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Основной недостаток использования Cgo - это снижение производительности.
    Вызовы C/C++ достаточно затратны по ресурсам, т.к. C ничего не знает о данных в Go и для вызова C необходимо полностью сохранять все регистры и переключать стек, за счёт этого и возрастают накладные расходы, соответственно снижается производительность.

    Использование Cgo имеет смысл, когда есть объёмные библиотеки написанные на C/C++, которые можно использовать. При этом написание кода на чистом Go намного затратнее, чем использование этих библиотек с Cgo.

    > в каких кейсах следует использовать cgo для улучшения производительности
    На сколько я понимаю при вызове простых функций производительность не улучшится, а наоборот, скорее ухудшится.
    Но не исключаю, что есть кейсы, когда есть серьёзные расчёты/жёсткое управление памятью (частые выделения/освобождения), когда за счёт того, что в этом случае не будет использован сборщик мусора можно получить увеличения производительности.

    У меня был подобный кейс на Perl, но принцип тот же.
    При скачивании HTML страниц размер занимаемой RAM скриптом постоянно увеличивался и в итоге "съедал" всю память на сервере.

    Задача скрипта была скачивать HTML страницы, извлекать из них все ссылки на внешние ресурсы.
    Я принял решение и написал функцию на С, которая выкачивала страницу, извлекала ссылки, очищала память и возвращала в Perl уже готовый список ссылок. Скрипты перестали постоянно "пухнуть", их можно было запустить в несколько раз больше по количеству на том же сервере + производительность стала явно выше.

    В общем всё сильно зависит от задачи, но, думаю, более 90% кейсов будет связано с тем, что намного дешевле использовать готовую библиотеку C/C++ с Cgo, чем переписать эту библиотеку на чистом Go.
    Ответ написан
    Комментировать
  • Когда использование Cgo оправданно?

    Когда оправдано, на своём примере - использование библиотек на C.

    Есть у нас оборудование, к которому идут проприетарные библиотеки на C для управления им. Реверсинженерить их было затратно. Соответвенно, cgo позволил бы использовать эти библиотеки в сервисе на go с минимальными затратами.
    Ответ написан
    Комментировать
  • Что такое оверхэд (overhead)?

    @egorinsk
    Неизбежные накладные расходы.

    Например, программа, которую вы написали, делает полезную работу в течение 10 мс, но на запуск и завершение виртуальный машины Ява уйдет дополнительно 5 секунд, и эти 5 секунд будут оверхедом.
    Ответ написан
    2 комментария
  • Как сделать нормальное выключение Websocket сервера?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Если я правильно понял задачу - вам нужно корректно закрыть все соединения и завершить работу WebSocket сервера.

    По сути аккуратное закрытие клиентского WebSocket соединения выглядит так:
    - сервер отправляет в сокет frame с типом Close
    - клиент при получении frame с типом Close формирует ответ с типом Close
    - сервер ждёт ответ от клиента с типом Close (клиент подтверждает закрытие соединения)
    - сервер со своей стороны закрываете сокет, клиент со своей стороны закрывает сокет

    Т.е. вам просто нужно в цикле во все открытые сокеты отправить frame'ы с типом Close, дождаться ответа с типом Close, после чего закрыть сокет, или по таймауту закрыть сокет.

    Для работы с websocket'ами я использовал вот этот пакет https://pkg.go.dev/github.com/gobwas/ws

    Пример отправки frame'а с типом Close
    closeFrame := ws.NewCloseFrame([]byte{})
    // отправляем 
    err := ws.WriteFrame(wsconn, closeFrame)


    Пример чтения ответа от клиента
    header, err := ws.ReadHeader(wsconn)
    if header.OpCode == ws.OpClose {
        // клиент подтвердил закрытие, соединение можно закрывать
        wsconn.Close()
    }
    Ответ написан
    3 комментария
  • Как писать нормальный код на Го?

    От себя добавлю еще парочку годных:
    Ответ написан
    Комментировать
  • Как писать нормальный код на Го?

    axifive
    @axifive
    Software Engineer
    Ответ написан
    Комментировать
  • Какой функционал добавить в пакет?

    vesper-bot
    @vesper-bot
    Любитель файрволлов
    Три варианта.
    1) Нужный.
    2) Не знаешь что добавить - не добавляй ничего. Зачем нужен ещё один пакет?
    3) Спроси у лида техзадание, зачем ему от тебя вспомогательный пакет. Может в самом деле ТЗ кривое. А если нет, станет понятно, что нужно добавлять.
    Ответ написан
    Комментировать
  • Как находить совпадение в кодовых базах нескольких программ?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Шёл 2021, sonarcube и статические анализаторы кода в продуктах jetbrains разработчики так и не научились использовать
    Ответ написан
    Комментировать