ну чтож, дубль 2
постом выше я собирался восстановить тут активность, но случилась мобилизация
активность, конечно, восстановилась, но не в канале :)
перед тем как начнем, важное напоминание для тех, кто остался: мобилизацию никто не заканчивал, военкоматы - избегайте, повестки - не берите, если есть возможность - уезжайте
3 месяца фултайма на go прошли успешно, испыт пройден
могу резюмировать, что свичнуть эти два языка между собой, если мы говорим о написании типового бэкенда, можно без особых проблем
если ты давно хотел, но никак не мог решиться - можно не бояться :)
теперь немного о том, о чем я планирую писать в ближайшие несколько месяцев
в общем и целом - я собираюсь подготовиться к ряду собесов, которые начну проходить с начала-середины 23-его года
опыта сложных собесов на go у меня мало, пробелов в знаниях в силу опыта на этом языке - тоже вагон, так что мне точно есть что разбирать и, соответственно, о чем писать, что-то в формате конспектов, что-то в формате заметок
в ближайшие пару недель буду делиться интересным из курса по concurrency: https://www.udemy.com/course/concurrency-in-go-golang
в целом большинство тем мне знакомы, многое пропускаю, но вот раздел про планировщик go прошел с большим интересом
в golang есть такая интересная вещь, как netpoller - это пакет, который позволяет преобразовать асинхронный ввод/вывод в блокирующий
зачем это нужно?
golang заточен работать под блокирующие вызовы
например, происходит синхронное чтение из файла, горутина блокируется и ждет, пока чтение завершится
планировщик, через 10 мс выбрасывает ее вниз очереди ожидания, и берет в работу другую горутину
с синхронными вызовами все просто и понятно
а что если вызов асинхронный? в go поступили просто - умеем работать с синхронными? значит сделаем из асинхронного синхронный :)
тут в дело вступает netpoller - компонент рантайма, который умеет блокировать горутину, при этом не блокируя текущий поток выполнения
текущий поток выполнения берет в работу новую горутину из очереди, а netpoller тем временем подписывается на API операционной системы, которое работает с асинхронными вызовами
как только API выбросит событие, что ответ получен - netpoller разбудит горутину и сообщит планировщику, что ей нужно выделить процессорное время
после чего планировщик заберет горутину в один из потоков и возьмет ее на выполнение
второй интересный момент из модуля про планировщик - asynchronous preempation
это механизм, добавленный в go 1.14, позволяющий вытеснить горутину, работающую дольше 10 мс, и дать возможность поработать другим горутинам из локальной очереди
да, до версии 1.14 в случае, если мы работали на одном ядре и запускали там горутину с бесконечным циклом - поток блокировался до явного вызова runtime.Gosched()
более подробно, если тебе интересно, про это можно почитать тут - https://habr.com/ru/post/502506/