Обновить
119.06

Go *

Компилируемый, многопоточный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Мириады запущенных задач на C#

Время на прочтение7 мин
Количество просмотров52K

Недавно на ресурсе Medium были опубликованы две статьи от одного и того же автора, затрагивающие функциональность C# async/await.


Основными выводами были:


  • рекурсивный вызов асинхронного метода в C# подвержен StackOverflowException
  • goroutine'ы лучше задач (тасков) в .NET в плане производительности

Но главная проблема вышеприведенных публикаций — абсолютное непонимание модели кооперативной многозадачности в C# с вводом читателей в заблуждение. Сами же бенчмарки — бессмысленные, как мы увидим позже.


Далее в статье я попытаюсь раскрыть суть проблемы более подробно с примерами решения.


TL;DR

После небольшой правки кода исходных примеров, реализация бенчмарка на .NET оказывается быстрее варианта Go. Попутно решаем проблему переполнения стека у рекурсивных асинхронных методов.


NB: использоваться будут свежевыпущенный .NET Core 2.0 и Go 1.8.3.

Читать дальше →

Импровизированный считыватель штрих кодов для 1С через Telegram на Go

Время на прочтение3 мин
Количество просмотров16K
Всем привет! Хочу поделиться тем, что возможно кому-то пригодится.

Захотелось, для разнообразия, что-нибудь несложное реализовать на Go, и тут параллельно были прочтены статьи на хабре про Telegram-ботов, а на работе проект по интеграции штрих-кодирования и 1С, ну вот и было решено совместить приятное с полезным и реализовать импровизированный считыватель штрих-кодов для тестирования и на пощупать как в 1С это работает.
Читать дальше →

Очень легкая система мониторинга с Телеграмом и Консулом

Время на прочтение4 мин
Количество просмотров14K


Всем счастья и добра!


Эволюционно так получилось, что в моем личном владении оказался не маленький зоопарк различных серверов: от дешевого Supermicro до топового (на момент выпуска) HP Gen 8. Все конечно связано оптикой и прочими радостями жизни.


Но сказ не про то, как сеть класть, и даже не про то, как сервера настраивать, а про то, как правильно просто на всем этом деле docker-compose сервисы поднимать и радоваться.

Читать дальше →

Надёжность Go в инфраструктуре Dropbox

Время на прочтение4 мин
Количество просмотров16K
Об авторе: Тэмми Бутов — технический руководитель инфраструктуры для разработчиков в Dropbox. Это управление потоками кода — полный цикл использования Go в Dropbox, от программирования до выпуска. Она выступала на конференции GopherCon 2017 на тему того, как разработчики Dropbox создают и поддерживают работу крупномасштабных сервисов на Go.

Как Dropbox пришёл к использованию Go


Тэмми цитирует статью Роба Пайка «Go в компании Google: языковой дизайн в службе разработки ПО» от 2012 года, поскольку она в целом хорошо передаёт, почему Go хорошо работает и в Dropbox:

«Go — эффективный, масштабируемый и производительный язык. Некоторые программисты получают удовольствие от работы с ним; другие находят его прозаическим, даже скучным. В этой статье мы расскажем, почему все эти позиции не противоречат друг другу. Go спроектирован для решения проблем, возникающих в софтверной разработке в Google, что привело к созданию языка, который не является прорывным с исследовательской точки зрения, тем не менее это прекрасный инструмент для разработки крупных софтверных проектов». — Роб Пайк, 2012

Масштаб Dropbox впечатляет:

  • Более 500 млн пользователей
  • 200 000 бизнес-пользователей
  • 500 петабайт пользовательских данных
  • Многоэкзабайтная система хранения Go
Читать дальше →

Selenium: для любителей яблок

Время на прочтение3 мин
Количество просмотров22K

Привет! Это моя новая статья, посвященная Selenium. Ранее я уже подробно рассказал об организации масштабируемого кластера Selenium (часть I, часть II). Затем мы рассмотрели вопрос использования Selenium в качестве инструмента отладки автотестов (раз, два), Наконец, нам удалось создать порядок из хаоса на Windows (ссылка). Сегодня мы будем иметь дело с яблоками, точнее с одним большим Яблоком (т.е. с Apple).


Читать дальше →

Делаем приложения с поиском на Go

Время на прочтение3 мин
Количество просмотров13K

Однажды в рассылке Golang Weekly мне попался проект Bleve. Это полнотекстовый поиск, который написан на Go. Проект интересный, и появилось бешеное желание получить с ним опыт работы.


Bleve может хранить данные в разных embedded БД:


  • BoltDB (использует по умолчанию)
  • LevelDB
  • RocksDB
  • Goleveldb
  • forestdb
  • Gtreap
Читать дальше →

Work-stealing планировщик в Go

Время на прочтение4 мин
Количество просмотров22K

Задача планировщика в Go — распределять запущенные горутины между потоками ОС, которые могут исполняться одним или большим количеством процессоров. В многопоточных вычислениях, возникли две парадигмы в планировании: делиться задачами (work sharing) и красть задачи (work stealing).


  • Work-sharing: Когда процессор генерирует новые потоки, он пытается мигрировать их на другие процессоры, в надежде, что они попадут к простаивающему или недостаточно нагруженному процессору.
  • Work-stealing: Недостаточно нагруженный процессор активно ищет потоки других процессоров и "крадет" некоторые из них.

Миграция потоков происходит реже при work stealing подходе, чем при work sharing. Когда все процессоры заняты, потоки не мигрируют. Как только появляется простаивающий процессор, рассматривается вариант миграции.


В Go начиная с версии 1.1 планировщик реализован по схеме work stealing и был написан Дмитрием Вьюковым. Эта статья подробно объясняет устройство work stealing планировщиков и как он устроен в Go.

Читать дальше →

Selenium: проще пареной репы…

Время на прочтение3 мин
Количество просмотров26K

Как вы уже могли заметить мы в команде Aerokube продолжаем упрощать жизнь в инфраструктуре тестирования. Сейчас мы усиленно работаем над удобными инструментами для, браузерного тестирования на основе Selenium. Одним из инструментов, о котором я уже рассказывал раньше, является Selenoid. Selenoid — это легковесный сервер, запускающий изолированные браузеры в Docker контейнерах. В предыдущих статьях (раз, два) я описал два возможных сценария использования Selenoid — работа с Docker и использование исполняемых файлов веб-драйверов в операционных системах, где отсутствует поддержка Docker. Сегодня я расскажу о новых возможностях, которые могут помочь в отладке браузерных тестов.


Читать дальше →

На пути к Go 2

Время на прочтение17 мин
Количество просмотров17K

Перевод блог поста и доклада Russ Cox с GopherCon 2017, с обращением ко всему Go сообществу помочь в обсуждении и планировании Go 2. Видео доклада будет добавлено сразу после опубликования.



25 сентября 2007 года, после того как Роб Пайк, Роберт Грисмайер и Кен Томпсон несколько дней обсуждали идею создания нового языка, Роб предложил имя "Go".



В следующем году, Ян Лэнс Тейлор и я присоединились к команде и мы впятером создали два компилятора и стандартную библиотеку, которые были публично открыты 10 ноября 2009.

Читать дальше →

Вы используете интерфейсы в Go неправильно!

Время на прочтение4 мин
Количество просмотров23K
С таким громким заголовком я думал сначала написать статью. Нет, на самом деле, вполне возможно, что у вас всё хорошо и эта статья — не про вас. Но очень часто, когда люди приходят из других языков, можно видеть, как они пытаются «притянуть за уши» паттерны из того языка, к которому они привыкли, и они в Go зачастую работают плохо.



В этой статье я хотел бы собрать несколько типичных ошибок, которые делают начинающие программисты на Go (и я в том числе), и как этих ошибок избежать.
Читать дальше →

Инструменты для разработчика Go: знакомимся с лейблами профайлера

Время на прочтение4 мин
Количество просмотров14K

DrawingПривет. Меня зовут Марко. Я системный программист в Badoo. Представляю вашему вниманию перевод поста замечательной rakyll о новой фиче в Go 1.9. Мне кажется, что лейблы будут очень полезны для профилирования ваших Go-программ. Мы в Badoo, например, используем аналогичную штуку для того, чтобы тегировать куски кода в наших программах на С. И если срабатывает таймер и в лог выводится стек-трейс, то в дополнение к нему мы выводим такой вот тег. В нем, например, может быть сказано, что мы обрабатывали фотографии пользователя с определенным UID. Это невероятно полезно, и я очень рад, что похожая возможность появилась и в Go.

Читать дальше →

Многопользовательская игра на Go через telnet

Время на прочтение5 мин
Количество просмотров16K
Всем привет! Меня зовут Олег и я SRE. В какой-то момент мне захотелось улучшить свои навыки программирования на Go и написать маленькую многопользовательскую игру.

Заниматься веб-анимацией или писать приложение под мобильную платформу мне не хотелось, поэтому я решил в качестве клиента использовать любимый инструмент сисадминов — telnet.

Вот что получилось:

image

Как мы суслика яблоками кормили или эффективный backend на Go для iOS

Время на прочтение18 мин
Количество просмотров19K


Как и обещал, рассказываю о том, как мы мигрировали свой бэкенд на Go и смогли уменьшить объем бизнес логики на клиенте более, чем на треть.


Для кого: небольшим компаниям, Go и мобильным разработчикам, а также всем, кто в тренде или просто интересуется данной тематикой.
О чем: причины перехода на Go, с какими сложностями столкнулись, а также инструкции и советы по улучшению архитектуры мобильного приложения и его бэкенда.
Уровень: junior и middle.


Читать дальше →

Ближайшие события

5 этапов разработки микросервиса

Время на прочтение4 мин
Количество просмотров11K
Всем тем, кто много слышал про микросервисы, но так и не решился сделать ни одного — посвящается.
По причинам создания и описанием всех “за” и “против” написано уже сотни статей — здесь же я расскажу про практическую сторону создания и использования.
image
Читать дальше →

Миллион WebSocket и Go

Время на прочтение11 мин
Количество просмотров103K

image


Привет всем! Меня зовут Сергей Камардин, я программист команды Почты Mail.Ru.


Это статья о том, как мы разработали высоконагруженный WebSocket-сервер на Go.


Если тема WebSocket вам близка, но Go — не совсем, надеюсь, статья все равно покажется вам интересной с точки зрения идей и приемов оптимизации.

Читать дальше →

Регистрация с помощью telegram бота

Время на прочтение7 мин
Количество просмотров46K
Сейчас почти на всех сайтах есть регистрация. Реализована она чаще всего с помощью e-mail, реже с помощью смс. А что если сделать регистрацию через telegram бота? В качестве логина на сайте мы сможем использовать подтверждённый номер телефона, а сам бот будет посылать одноразовые коды для входа. В данной статье описан процесс создания такого бота на языке Golang.

image
Пример работы бота

Хотелось бы сразу отметить: в статье не будет описана реализация входа на сайт по одноразовым кодам.
Читать дальше →

Расставляем точки над микросервисами. Секция Avito на РИТ++ 2017 (Видео)

Время на прочтение4 мин
Количество просмотров26K
Вот и подоспели материалы с фестиваля РИТ++ 2017. Мы выступили там с докладами по темам machine learning, front-end и mobile разработки и провели отдельный тематический блок, посвященный микросервисам. Под катом – видеозаписи выступлений на этой секции наших докладчиков и коллег из других компаний. Обязательно загляните, чтобы узнать о подходах к работе с микросервисами и интересных приемах, которые реально использовать для решения ваших задач.


Архитектура и алгоритмы индексации аудиозаписей ВКонтакте

Время на прочтение8 мин
Количество просмотров39K


Расскажем о том, как устроен поиск похожих треков среди всех аудиозаписей ВКонтакте.

Зачем всё это надо?


У нас действительно много музыки. Много — это больше 400 миллионов треков, которые весят примерно 4 ПБ. Если загрузить всю музыку из ВКонтакте на 64 ГБ айфоны, и положить их друг на друга, получится башня выше Эйфелевой. Каждый день в эту стопку нужно добавлять еще 25 айфонов — или 150 тысяч новых аудиозаписей объёмом 1.5 ТБ.

Конечно, далеко не все эти файлы уникальны. У каждого аудио есть данные об исполнителе и названии (опционально — текст и жанр), которые пользователь заполняет при загрузке песни на сайт. Премодерации нет. В результате мы получаем одинаковые песни под разными названиями, ремиксы, концертные и студийные записи одних и тех же композиций, и, конечно, совсем неверно названные треки.

Если научиться достаточно точно находить одинаковые (или очень похожие) аудиозаписи, можно применять это с пользой, например:

  • не дублировать в поиске один трек под разными названиями;
  • предлагать прослушать любимую композицию в более высоком качестве;
  • добавлять обложки и текст ко всем вариантам песни;
  • усовершенствовать механизм рекомендаций;
  • улучшить работу с жалобами владельцев контента.

Читать дальше →

Альтернатива Emacs Lisp'у

Время на прочтение10 мин
Количество просмотров9.8K

image


Вы когда-нибудь искали альтернативу Emacs Lisp'у? Давайте попробуем добавить в Emacs ещё один язык программирования.


В этой статье:


  • Потенциальные преимущества, которые будут получены при возможности расширять Emacs на Go;
  • Определим способы взаимодействия Go и Emacs Lisp;
  • Затронем некоторые детали реализации описанного транскомпилятора;

Статья может заинтересовать пользователей Emacs'а, а также тех, кому небезразличны все эти бесчисленные реализации бесчисленных языков программирования.


В самом конце статьи представлена ссылка на work in progress проект, который позволяет конвертировать Go в Emacs Lisp.

Читать дальше →

Go без глобальных переменных

Время на прочтение7 мин
Количество просмотров14K

Перевод статьи Дейва Чини — ответа на предыдущий пост Питера Бургона "Теория современного Go" — с попыткой провести мысленный эксперимент, как бы выглядел Go без переменных в глобальной области видимости вообще. Хотя в некоторых абзацах можно сломать язык, но пост достаточно интересный.


Давайте проведём мысленный эксперимент, как бы выглядел Go, если бы мы избавились от переменных в глобальной области видимости пакетов. Какие бы были последствия и что мы можем узнать о дизайне Go программ из этого эксперимента?


Я буду говорить только о вычёркивании var, остальные пять определений верхнего уровня остаются разрешены в нашем эксперименте, так как они, по сути, являются константами на этапе компиляции. И, конечно же, вы можете продолжать определять переменные в функциях и любых блоках.

Читать дальше →

Вклад авторов