golang協程交叉打印,golang 結束協程

本文目錄一覽:

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-hant/n/137697.html

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

相關推薦

  • 使用Golang調用Python

    在現代軟件開發中,多種編程語言的協作是相當普遍的。其中一種使用場景是Golang調用Python,這使得在使用Python庫的同時,可以利用Golang的高性能和強大並發能力。這篇…

    編程 2025-04-29
  • 使用Golang創建黑色背景圖片的方法

    本文將從多個方面介紹使用Golang創建黑色背景圖片的方法。 一、安裝必要的代碼庫和工具 在開始創建黑色背景圖片之前,我們需要先安裝必要的代碼庫和工具: go get -u git…

    編程 2025-04-29
  • Golang中使用strings.Split函數進行字符串分割的方法

    一、Split函數的基本用法 字符串是編程中常見的數據類型,它們可以在程序中被處理、存儲和傳輸。在Go語言中,字符串也是一個基本的數據類型,而strings包提供了一些操作字符串的…

    編程 2025-04-23
  • Golang環境變量全面解析

    Golang是一門非常流行的開發語言,擁有高效的CGO、簡單易懂的語法、高並發能力等優點,然而它也需要使用環境變量來配置一些參數。在本篇文章中,我們將從多個方面對Golang環境變…

    編程 2025-04-23
  • 深入下探golang http server

    Go語言已經成為了軟件開發領域的熱門語言,它的高性能、應用廣泛、安全性好,使得它成為了眾多開發者心目中的首選編程語言。在眾多應用場景中,golang http server的應用非…

    編程 2025-04-23
  • Compacted:一個高性能的Golang緩存庫

    一、簡介 Compacted是一個使用Golang編寫的緩存庫,旨在提供高性能的內存緩存功能。相對於其他常見的緩存庫,Compacted在內存使用和性能方面都做了一定的優化。 緩存…

    編程 2025-04-23
  • Golang nil解析

    一、什麼是nil Nil是Golang語言中的一個預定義標識符,表示一個零值對象,通常表示一個空指針。Nil被定義為指針類型、函數類型、接口類型、map類型、Slice類型、Cha…

    編程 2025-04-23
  • Golang中文社區介紹

    Go語言或者叫Golang是一個開源項目,目前是由Google開發維護的一種靜態類型、並發安全、編譯型的編程語言。Go語言的特點是結構清晰、並發能力強、具有垃圾回收機制並且支持跨平…

    編程 2025-04-23
  • 詳解golang walk控件庫

    Golang提供的可視化庫有很多個,其中walk是一個比較好用且強大的庫。本文將從多個方面對walk進行詳細闡述,包括基本控件、布局、菜單、圖標等方面的內容。 一、控件基礎 Gol…

    編程 2025-04-22
  • Golang泛型詳解

    Golang泛型成為眾多開發人員關注的話題,因為它使得代碼更加通用、可重用、簡單、易於維護。那麼,什麼是泛型、為什麼它如此重要,如何使用它?本文將從多個方面為您詳細闡述Golang…

    編程 2025-04-20

發表回復

登錄後才能評論