go 協程與主線程強佔執行

2022-03-05 18:45:32 字數 2123 閱讀 2543

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

1 package main

2 3 import (

4 "fmt"

5 "time"

6 )7 8 func main()

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

16 c := make(chan int)

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

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

19 x, y :=

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

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

24 25 c2 := make(chan int, 2)

26 c2

27 c2

28 fmt.println(

29 fmt.println(

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

32 c3 := make(chan int, 10)

33 go fibonacci(cap(c3), c3)

34 for i := range c3

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

39 c4 := make(chan int)

40 quit := make(chan int)

41 go func()

45 quit

46 }()

47 fibonacci2(c4, quit)

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

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

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

52 for

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等。相對於協程,你可能對程序和執行緒更為熟悉。程序一般代表乙個應用服務,在乙個應用服務中可以建立多個執行緒,而協程與程序 執行緒的概念不一...