Пакет runtime
В этой теме мы разберемся, что такое runtime и как он работает.
runtime — полезный пакет, который позволяет программисту управлять поведением среды выполнения. У него много полезных возможностей, вот некоторые из них:
-
runtime.Goexit(): для преждевременного выхода из горутины. Он запускает все отложенные вызовы перед завершением горутины. Кроме того, это не паника. Вызов Goexit из основной горутины завершает работу этой горутины без возврата func main. Поскольку функция func main не вернулась, программа продолжает выполнение других горутин. Если все другие горутины завершатся, программа завершит свое исполнение.
-
runtime.Gosched(): вытесняет текущую горутину, позволяя запускать другие горутины. Он не приостанавливает текущую горутину, поэтому выполнение возобновится автоматически, как наступит очередь в планировщике. Это похоже на ключевое слово yield в других языках программирования, таких как nodejs и python.
-
runtime.GC(): запускает сборку мусора Stop The World и блокирует вызывающую программу до завершения сборки мусора. Это также может заблокировать всю программу.
-
runtime.KeepAlive(): помечает свой аргумент как доступный в данный момент. Это гарантирует, что объект не будет освобожден, а его финализатор не будет запущен до точки в программе, где вызывается KeepAlive. С примером подобного случая ты можешь ознакомиться на сайте go.dev.
-
runtime.SetFinalizer(): позволяет связать функцию обратного вызова с объектом, который вызывается, когда объект становится недоступным. Этот обратный вызов выполняется в отдельной горутине, и эта текущая ассоциация очищается. Это также делает этот объект снова доступным, и тот же объект подходит для сборки мусора при следующем запуске GC. Однако объект должен быть указателем. Нет гарантии, что финализаторы будут запущены до выхода из программы, поэтому обычно они полезны только для высвобождения ресурсов, не связанных с памятью, а связанных с объектом, во время долго выполняющейся программы. Не гарантируется, что финализатор будет работать для объектов, выделенных в инициализаторах для переменных уровня пакета (глобальные переменные). Такие объекты могут размещаться компоновщиком, а не кучей. Одна горутина последовательно запускает все финализаторы программы. Если финализатор должен работать в течение длительного времени, он должен сделать это, запустив новую горутину.
-
runtime.LockOSThread(): связывает вызывающую горутину с текущим потоком операционной системы. Вызывающая горутина всегда будет выполняться в этом потоке, и никакая другая горутина не будет выполняться в нем, пока вызывающая горутина не сделает столько же вызовов UnlockOSThread, сколько и LockOSThread. Если вызывающая горутина завершает работу, не разблокировав поток, поток будет завершен. Это полезно для поддержания ThreadLocal состояния, подобного используемому такими библиотеками, как Cocoa, OpenGL, libSDL.
-
runtime.NumCPU(): возвращает количество логических процессоров, используемых текущим процессом. Эта функция используется для установки значения для GOMAXPROCS похожа на runtime.GOMAXPROCS(runtime.NumCPU()). Однако обрати внимание, что начиная с Go 1.5, значением по умолчанию является количество ядер. Тебе нужно только явно установить его, если ты не согласен с этим в более новых версиях Go. Значение по умолчанию в ранних версиях было 1.
-
runtime.ReadMemStats(): осуществляет диагностику проблем с памятью. Дает подробную картину того, как память выделяется, используется, освобождается и GC'ируется. С примером кода, демонстрирующим его использование, ты можешь ознакомиться по ссылке или на скриншотах ниже.
Результат.
С оригиналом статьи ты можешь ознакомиться по ссылке.
Рекомендуем также ознакомиться с дополнительным материалом: