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