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