最近发布的主题
暂无
最近发布的文章
暂无
最近分享的资源
暂无
最近发布的项目
暂无
最近的评论
-
评论了博文 golang在并发下GOMAXPROCS(1)這有些問題,goroutine本來就都有被掛起機會,即使單cpu下當你for迴圈次數大時依然會被掛起 參考以下程式碼即使只叫起兩個goroutine依舊會干擾,若要保證順序性應該善用channel來達成 ```go package main import ( "fmt" "runtime" "sync" ) func main() { runtime.GOMAXPROCS(1) var wg sync.WaitGroup wg.Add(2) max := 100000 fmt.Println("go start") go func() { defer wg.Done() count := 0 for { if count > max { break } fmt.Println("No.1 G:", count) count++ } }() go func() { defer wg.Done() count := 0 for { if count > max { break } fmt.Println("No.2 G:", count) count++ } }() wg.Wait() fmt.Println("Done") } ```
-
评论了主题 信道定义了写入,没有定义读取,为什么没有死锁3楼 @jiangyd https://github.com/golang/go/issues/33004?fbclid=IwAR0LLl3BG1RNfJY4EmPYDMk-j2_rVQyXY5lgiKgFayYjUDHXu_jT943DtWQ 這裡有解答,簡而言之就是不能完全依靠deadlock檢測器
-
评论了主题 招聘GO程序开发 JD
-
评论了主题 打印顺序为什么没有按照预期打印## 為什麼是10先被打印出來? 首先要先知道goroutine隊列執行本身就可能是無序的,其原理可去理解Golang的GMP模型 單核心在數字大時就不會總是最後一個被優先print出來、也不會總是照順序 接著我們用trace tool做三個實驗,看看單核心在什麼情況下`最後一個數字不會被先print` *** ##### * 實驗一:for 0~999 單核心 結果:執行後第一個被print的為999  1.先看trace總覽,goroutines在runtime.main執行結束後開始下降(青藍色最高峰),也就是1000個G開始被調用消耗掉  2.接著看看第一個被調用的G,就是print數字999的goroutine,可以看到Start Stack Trace有成功執行syscall.write,將999打印到螢幕上,違反了我們平常循序或隊列的直覺  *** ### * 實驗二:for 0~9999 單核心 結果:執行後第一個不為9999  1.與實驗一相同,goroutines在runtime.main執行結束後才開始下降,但可以注意到GC出現了!  2.來到第一個被調用的G,可以發現應該就是要執行print數字9999的goroutine,`卻沒有執行syscall.write`,而是進入GC的程序,才造成與實驗一的不同結果  *** ### * 實驗三:for 0~999 多核心 結果:執行後亂序出現  1.從trace可以發現goroutines***不會再等待*** runtime.main執行完畢才開始被調用  *** ### * 實驗總結: 我們可以發現在單核心情況下,runtime.main的過程中G不斷在被創建,然而要等到runtime.main結束才開始消耗G。 * 問題一: 為什麼第一個被調用的G是for迴圈中最後一個999呢? `解釋` stackoverflow也有類似問題被問過(註一),但回答依舊是goroutine本身隊列無序,因此我們只能大略推論其調度器邏輯是為了***效率***,也就是最後一個goroutine被創建後就直接消耗掉,因此才會出現第一個被執行的G—是for迴圈中最後一個被創建的G。 * 問題二:同樣是單核心情況,為什麼迴圈數字變大,第一個print的不是最後一個數字呢? `解釋` 從實驗二可以發現是***GC從中作梗***,第一個被調用的G仍然是最後被創建的G,但是因為GC的作用下syscall.write被延後執行。 * 問題三:單核心跟多核心有什麼差異? `解釋` 實驗三可以簡潔明瞭發現問題在runtime.main創建G時,`其他CPU可以同時執行G`,就不會有最後創建的G第一個被消耗情況。 註一:<https://stackoverflow.com/questions/35153010/goroutines-always-execute-last-in-first-out> 後記: 解答兄弟問題,為我快樂之本 此篇同時更新到個人的github,若喜歡請幫忙給個星星start,有任何觀念錯誤也請多多指教〜 <https://github.com/jou66jou/go-analysis-goroutine> trace tool 教學: <https://www.itcodemonkey.com/article/5419.html> Golang的GMP模型介紹: <https://www.cnblogs.com/sunsky303/p/9705727.html>
-
评论了主题 咨询类似这种这么过滤呢請參考以下輸出,要過濾的是`\t` ```go //隨手測試用 package main import ( "fmt" "strings" ) func main() { str2 := `a 1 2 3 b 4 5 6 c 7 8 9 ` lines2 := strings.Split(str2, "\n") fmt.Printf("特殊字符tab鍵的byte值: %+v\n", []byte("\t")) // 查看tab鍵對應特殊字元"\t"的[]byte for _, line := range lines2 { if strings.Trim(line, "\t") != "" { // 去掉字串前後的tab字元 fmt.Printf("有實際內容:%+v\n", []byte(line)) } else { fmt.Printf("空內容:%+v\n", []byte(line)) } } } ```