本質上,goroutine 就是協程。
不同的是,Golang 在runtime、系統呼叫等多方面對goroutine 調度進行了封裝和處理,當遇到長時間執行或進行系統呼叫時,會主動把當前goroutine 的CPU (P) 轉讓出去,讓其他goroutine 能被調度並執行,也就是Golang 從語言層面支持了協程。
Golang 的一大特色就是從語言層面原生支援協程,在函數或方法前面加 go關鍵字就可建立一個協程。 (建議學習:go)
協程(coroutine)是Go語言中的輕量級執行緒實現,由Go執行時間(runtime)管理。
GO版本:go version go1.4.2 linux/amd64
測試環境:
[root@localhost mpro]# more /proc/cpuinfo | grep "model name" model name : Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz model name : Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz model name : Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz model name : Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz [root@localhost mpro]# [root@localhost mpro]# grep MemTotal /proc/meminfo MemTotal: 3868776 kB [root@localhost mpro]# getconf LONG_BIT 64 [root@localhost mpro]# more /etc/redhat-release CentOS Linux release 7.1.1503 (Core)
測試案例:
package main import ( "time" ) func main() { for i := 0; i < 200000; i++ { go func() { time.Sleep(5 * time.Second) }() } time.Sleep(10 * time.Second) }
執行程式前:
top - 18:53:19 up 19 min, 3 users, load average: 0.00, 0.04, 0.11 Tasks: 522 total, 1 running, 521 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.1 us, 0.2 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st KiB Mem : 3868776 total, 3327732 free, 235764 used, 305280 buff/cache KiB Swap: 2097148 total, 2097148 free, 0 used. 3397344 avail Mem
執行程式後:
top - 18:53:37 up 19 min, 3 users, load average: 0.00, 0.04, 0.11 Tasks: 524 total, 1 running, 523 sleeping, 0 stopped, 0 zombie %Cpu(s): 1.2 us, 10.6 sy, 0.0 ni, 88.2 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st KiB Mem : 3868776 total, 2793732 free, 752512 used, 322532 buff/cache KiB Swap: 2097148 total, 2097148 free, 0 used. 2880016 avail Mem
#總結:20萬個協程佔用了500M記憶體50萬KB
#平均一個協程佔用2.5KB
#以上是golang 協程佔多大內存的詳細內容。更多資訊請關注PHP中文網其他相關文章!