本文目錄一覽:
golang列印棧大小
8.1。根據查詢golang列印棧官方公布的參數顯示,golang列印棧大小為8.1,Go又稱Golang,是Google開發的一種靜態強類型、編譯型、並髮型,並具有垃圾回收功能的編程語言。
golang調用遠程印表機
golang可以遠程操控印表機。根據相關資料搜索查詢得知,印表機可以支持遠程列印,不限制設備和距離,不需要電腦和手機配合。
golangos.exit阻止
設置可同時執行的邏輯Cpu數量,默認和硬體的線程數一致而不是核心數,可以通過調用GOMAXPROCS(-1)來獲取當前邏輯Cpu數最好在main函數之前設置它,GOMAXPROCS同時也是go的環境變數之一。
return結束當前函數,並返回指定值;runtime.Goexit結束當前goroutine,其他的goroutine不受影響,主程序也一樣繼續運行;os.Exit會結束當前程序,不管你三七二十一;暫停當前goroutine,使其他goroutine先行運算。只是暫停,不是掛起,當時間片輪轉到該協程時,Gosched()後面的操作將自動恢復。還沒等到子協程執行,主協程就已經執行完退出了,子協程將不再執行,所以列印的全部是主協程的數據。當然,實際上這個執行結果也是不確定的,只是大概率出現以上輸出,因為主協程和子協程間並沒有絕對的順序關係。在列印goroutine1之前,主協程調用了runtime.Gosched()方法,暫停了主協程。子協程獲得了調度,從而先行列印了goroutine2。主協程不是一定要等其他協程執行完才會繼續執行,而是一定時間。如果這個時間內其他協程沒有執行完,那麼主協程將繼續執行,立即終止當前協程,不會影響其它協程,且終止前會調用此協程聲明的defer方法。由於Goexit不是panic,所以recover捕獲的error會為nil。當main方法所在主協程調用Goexit時,Goexit不會return,所以主協程將繼續等待子協程執行,當所有子協程執行完時,程序報錯deadlock。
Channel簡易教程
不同於傳統的多線程並發模型使用共享內存來實現線程間通信的方式,golang 的哲學是通過 channel 進行協程(goroutine)之間的通信來實現數據共享。這種方式的優點是通過提供原子的通信原語,避免了競態情形(race condition)下複雜的鎖機制。
channel 可以看成一個 FIFO 隊列,對 FIFO 隊列的讀寫都是原子的操作,不需要加鎖。對 channel 的操作行為結果總結如下:
讀取一個已關閉的 channel 時,總是能讀取到對應類型的零值,為了和讀取非空未關閉 channel 的行為區別,可以使用兩個接收值:
golang 中大部分類型都是值類型(只有 slice / channel / map 是引用類型),讀/寫類型是值類型的 channel 時, 如果元素 size 比較大時,應該使用指針代替,避免頻繁的內存拷貝開銷 。
main方法里創建了一個string類型的Channel,實現主協程與子協程 go SendMessage 進行通信。主協程執行到 -values 時發生阻塞,等待讀取 values Channel的值,而子協程執行 SendMessage 方法時寫入 values Channel。即,主協程發生阻塞,等待子協程執行完畢後再繼續執行。
執行的結果如下:
從日誌可以看出,列印val語句必須在子協程 go SendMessage 執行完成後才執行。
如果在此基礎上添加多一個協程寫入 values Channel會發生什麼?
在主協程中,啟動兩個子協程給Channel寫數據。而在 SendMessage 方法里,為了達到顯示效果,在寫入Channel前先睡眠1秒,在主協程也添加睡眠時間。
執行日誌列印如下:
發現只有其中一個協程完成寫入Channel的操作。因為此Channel沒有設置緩存,所有隻能保存一個寫入值。
那麼如何才能保證兩個子協程能正常寫入Channel呢?
為了保證上面的兩個子協程能順利地把值寫入Channel,我們創建一個帶緩衝的Channel。
新創建的Channel緩衝兩個值,這樣就能保證兩個子協程能正常寫入到Channel中。下面看看列印日誌:
如我們猜想一樣,兩個子協程都能順利結束。
晚安~
原創文章,作者:KECK,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/137697.html