go 協程與主線程強佔執行

2021-07-27 03:53:18 字數 1907 閱讀 1333

最近在學習了go 語言 ,  正好學習到了 協程這一塊 ,遇到了困惑的地方.這個是go語言官方文件 . 在我的理解當中是,協程只能在主線程釋放時間片後才會經過系統排程來執行協程,其實正確的也確實是這樣的,但是我遇到了協程強佔主線程的乙個問題,經過幫助,現在已經了解.廢話不多說,先看**

1

package main23

import (

4 "fmt"

5 "time"6)

78func main()

15fmt.println("===", a[:len(a)/2])

16c := make(chan int)

17go sum(a[:len(a)/2], c)

18go sum(a[len(a)/2:], c)

19x, y :=

2021

fmt.println(x, y, x+y)

2223

fmt.println("---------------2")

2425

c2 := make(chan int, 2)

26c2

27c2

28fmt.println(

29fmt.println(

3031

fmt.println("---------------3")

32c3 := make(chan int, 10)

33go fibonacci(cap(c3), c3)

34for i := range c3

3738

fmt.println("---------------4")

39c4 := make(chan int)

40quit := make(chan int)

41go func()

45quit

46}()

47fibonacci2(c4, quit)

4849

fmt.println("---------------5")

50tick := time.tick(100 * time.millisecond)

51boom := time.after(500 * time.millisecond)

52for 63}

*/64}65

66 func say(s string

) 71 }

先看兩次**執行結果

第一次:  (結合上面**檢視列印順序)

第二次:(結合第一次檢視列印順序)

是不是發現了每次的列印順序是不同的

這個就是協程強佔執行

我們先來看下它的執行循序 , 主線程執行====>釋放時間片====>協程執行==>釋放時間片====>主線程執行

根據這段** 

1 say("hello")
我們知道,這個是屬於主線程裡面的,所以優先執行(注意實參是"hello")  

然後看看 say 方法 

1 func say(s string

) 6 }

當執行到迴圈裡面的 

time.sleep(100 * time.millisecond)
會釋放時間片,同時 暫停執行**,系統排程到協程 

go say("world")
也是同乙個方法,同時也會執行

time.sleep(100 * time.millisecond)
釋放時間片 

於是再列印的時候就會出現強佔執行

go 協程與主線程強佔執行

最近在學習了go 語言 正好學習到了 協程這一塊 遇到了困惑的地方.這個是go語言官方文件 在我的理解當中是,協程只能在主線程釋放時間片後才會經過系統排程來執行協程,其實正確的也確實是這樣的,但是我遇到了協程強佔主線程的乙個問題,經過幫助,現在已經了解.廢話不多說,先看 1 package main...

go 協程與主線程強佔執行

最近在學習了go 語言 正好學習到了 協程這一塊 遇到了困惑的地方.這個是go語言官方文件 在我的理解當中是,協程只能在主線程釋放時間片後才會經過系統排程來執行協程,其實正確的也確實是這樣的,但是我遇到了協程強佔主線程的乙個問題,經過幫助,現在已經了解.廢話不多說,先看 1 package main...

協程與執行緒

reference 協程不只在go語言中實現了,其實目前大部分語言都實現了自己的一套協程,包括c erlang python lua j ascript ruby等。相對於協程,你可能對程序和執行緒更為熟悉。程序一般代表乙個應用服務,在乙個應用服務中可以建立多個執行緒,而協程與程序 執行緒的概念不一...