golang後台任務,golang定時任務調度

本文目錄一覽:

golang做後台開發有什麼優勢和劣勢

golang在近些年被追捧,不管某華,某阿在很多服務器開發上都在使用。

你不用懷疑golang的

優勢:部署簡單,良好的語言設計,並發性好,性能優良,開發簡潔快,標準庫強大,編譯簡單

缺點:還存在一些缺陷(例如垃圾回收),缺少安全檢查,性能方面目前比不過java,第三方庫不及java

但作為新興語種,我們不用擔心,背後有谷歌支持和java持平也就是時間上的問題。

而且前面還有某華,某阿頂着不怕。

一起使用GO(golang) 來做一個後台管理系統系列10 使用mod 來管理包

原項目採用gopath來管理的引用庫,但有小夥伴反應說包不好下,雖然我把對應的包做了百度雲盤共享,但小夥伴們仍然感覺不太好用。特別是最近把go SDK升級到1.18.在管理包上終於下決心使用mod來重新重構下包管理。

一、配置啟用Mod

首先那:

確定是否開啟了

如果沒有開啟請開啟它。開啟命令執行:

#設置 使用七牛雲下載

來看下現在的配置:

二、創建項目

上邊都說了如何開啟了。下面介紹下如何使用

1. 可以隨便找一個目錄創建項目:myGoProjectNew

這個時候查看目錄下會多出一個go.mod的文件:

裏面也有了。標識了下SDK的版本1.18

2. 創建 main.go文件

3. 執行:

這時候就會自動下載引用了。

查看Go.mod文件

最後放兩張效果圖:

感覺還可以得點贊收藏哦。想要源碼的私信我獲取源碼。

Golang什麼時候會觸發GC

Golang採用了三色標記法來進行垃圾回收,那麼在什麼場景下會觸發這個回收動作呢?

源碼主要位於文件 src/runtime/mgc.go go version 1.16

觸發條件從大方面說,可分為 手動觸發 和 系統觸發 兩種方式。手動觸發一般很少用,主要由開發者通過調用 runtime.GC() 函數來實現,而對於系統自動觸發是 運行時 根據一些條件判斷來進行的,這也正是本文要介紹的內容。

不管哪種觸發方式,底層回收機制是一樣的,所以我們先看一下手動觸發,根據它來找系統觸發的條件。

可以看到開始執行GC的是 gcStart() 函數,它有一個 gcTrigger 參數,是一個觸發條件結構體,它的結構體也很簡單。

其實在Golang 內部所有的GC都是通過 gcStart() 函數,然後指定一個 gcTrigger 的參數來開始的,而手動觸髮指定的條件值為 gcTriggerCycle 。 gcStart 是一個很複雜的函數,有興趣的可以看一下源碼實現。

對於 kind 的值有三種,分別為 gcTriggerHeap 、 gcTriggerTime 和 gcTriggerCycle 。

運行時會通過 gcTrigger.test() 函數來決定是否需要觸發GC,只要滿足上面基中一個即可。

到此我們基本明白了這三種觸發GC的條件,那麼對於系統自動觸發這種,Golang 從一個程序的開始到運行,它又是如何一步一步監控到這個條件的呢?

其實 runtime 在程序啟動時,會在一個初始化函數 init() 里啟用一個 forcegchelper() 函數,這個函數位於 proc.go 文件。

為了減少系統資源佔用,在 forcegchelper 函數里會通過 goparkunlock() 函數主動讓自己陷入休眠,以後由 sysmon() 監控線程根據條件來恢復這個gc goroutine。

可以看到 sysmon() 會在一個 for 語句里一直判斷這個 gcTriggerTime 這個條件是否滿足,如果滿足的話,會將 forcegc.g 這個 goroutine 添加到全局隊列里進行調度(這裡 forcegc 是一個全局變量)。

調度器在調度循環 runtime.schedule 中還可以通過垃圾收集控制器的 runtime.gcControllerState.findRunnabledGCWorker 獲取並執行用於後台標記的任務。

原創文章,作者:QTGG,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/140734.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
QTGG的頭像QTGG
上一篇 2024-10-04 00:24
下一篇 2024-10-04 00:24

相關推薦

發表回復

登錄後才能評論