併發 併發任務單元

2021-10-25 08:31:04 字數 625 閱讀 9318

go func(s string) ("hello")
go 語言寫併發非常容易,因為所有的使用者**都是放在併發裡執行的,包括 main 入口函式所有的函式都處在併發單元上執行。併發任務單元稱之為 goroutine。

當我們執行 go 指令的時候,實際上它會建立乙個併發任務,函式名字或者指標加上引數打包建立乙個新的 goroutine,放到本地佇列,然後 main goroutine 不會等待 goroutine 什麼時候執行,main goroutine 會繼續執行後面的邏輯。

什麼時候執行 goroutine 是排程器排程的與當前的 main 函式無關。因為當前有很多併發線,本地佇列還會與全域性佇列進行互動。正常情況下,併發線從自己的本地佇列查詢準備執行的 goroutine,如果本地佇列沒有,則到全域性佇列查詢。每個本地佇列大小有 256 個限制,如果多就會把一半轉移給全域性佇列給其他的併發線使用。

如果其它併發線本地佇列沒有就會從全域性佇列取 goroutine,如果全域性佇列沒有則到其他併發線的本地佇列取,因為排程器有責任讓所有等待執行佇列裡併發單元盡可能快地執行。

所以對於 main 函式來說,建立了併發單元,這個任務未必由 main 執行,因為放到本地佇列會面臨兩種狀況,一種狀況是本地佇列滿了被轉移到全域性佇列裡

shell 併發任務

shell 使用 和wait 實現併發任務 例項 順序執行指令碼 in concurrence.sh bin bash echo current date date for i in seq 100 110 do echo sleep 1 sleep 1 done echo current date...

golang 典型併發任務

目錄僅需任意任務完成 所有任務都完成 物件池懶漢式,執行緒安全 適用於只執行一次的任務,比如載入配置檔案。package main import fmt math rand sync time func init func main 這裡所有任務都完成了,但是只用了最快的乙個結果,所以是所有任務都完...

併發程式設計 任務執行

1 每當看到下面這種 new thread runnable start 時,請考慮用executor 2 executor 1 建立方式 executors.new.2 通過使用executor,可以實現各種調優 管理 監視 記錄日誌 錯誤報告 3 executor有4個生命週期 建立 提交 開始...