---------------------------------------- go 併發
// 註解:go 語言天生為程式併發所設計,可以說go的強項就是在cpu併發上的處理。// go 語言層面就支援了併發。(不是一般高階語言的多執行緒併發,是系統級真實併發)
// go 語言通過安全的通道傳送和接受資料以實現同步
// 一般情況下,乙個普通的桌面計算機跑十幾二十幾個執行緒就有點負載過大了,但是同樣的硬體裝置go可以輕鬆上k。
----------------------------------------- goroutine
// 註解:go 併發設計的核心,goroutine在併發中起到的作用就是協程(csp),但是它比執行緒更小。(協程=微執行緒)// go 不支援後台協程,意思就是主程式退出,協程跟著一起退出
func newtask()
}func main()
}// result :
// main...
// new task ...
// ....
----------------------------------------- gosched
// 註解:讓出cpu時間片,讓出當前 gorotine 的執行許可權,// 排程器安排其他等待任務執行,並在下次某個時候從該位置恢復執行。
func main()
}()for i := 0; i < 2; i++
// 這種情況,匿名函式未得到執行程式就結束了。
// 時間片案例演示**,修改如下:
for i := 0 ....
// 執行結果:
// go go ... hello ..
}
----------------------------------------- goexit
import "runtime"// 註解:終止所在的協程 (所在的協程不是當前函式)
func test()
func main()
for
// result:
// aaaa cccc
}
----------------------------------------- gomaxprocs
// 註解:設定可以平行計算的 cpu 核數的最大值import "runtime"
func main()
// 列印結果:11111.. 一大片, 00000...一大片
// 如果設定 gomaxprocs(4) 為 4 核交叉效果更好
}
----------------------------------------- 資源爭奪問題 channel
// 註解:channel 也是一種資料型別,同步// 語法:channel <- value // 傳送 value 資料到 channel
// <- channel // 接收並丟棄
// 案例:
// 全域性變數,建立乙個 channel
var ch = make(chan int)
// 定義乙個印表機,引數為字串,按每個字元列印
func printer(str string)
fmt.printf("\n")
}func person1()
func person2()
func main()
// 註解: 【認真看】
// 沒有 channel 的情況
// 列印結果混亂,person1 列印乙個h,person2 列印乙個 w,交叉了。不符合我們的要求
// 增加 channel ,則在 <-ch 的地方進行了阻塞,通過進、出的方式融合這種解決這種併發互搶資源的問題。
----------------------------------------- channel 實現同步和資料互動
fun main()ch <- "我是子協程,工作完畢"
}str := <-ch // 沒有資料前,阻塞
fmt.println("str = ", str)
}// 注意:程式需求:主程式結束之前,能夠完整執行匿名函式中的**
// 使用 channel 配合完成
----------------------------------------- channel 無快取&有快取
c1 := make(chan int) 無緩衝c2 := make(chan int,1) 有緩衝
c1 < -1
// 無緩衝:不僅僅是向 c1 通道放 1,
// 而是一直要等有別的協程 <-c1 接手了這個引數,那麼c1<-1才會繼續下去,要不然就一直阻塞著。
// 有緩衝: c2<-1 則不會阻塞,因為緩衝大小是1(其實是緩衝大小為0),
// 只有當放第二個值的時候,第乙個還沒被人拿走,這時候才會阻塞。
// 不需要再使用記得關閉channel close(c1)
// 判斷管道是否關閉 if num, ok := <- c1; ok == true
----------------------------------------- channel 單方向
var ch1 chan int // ch1 是乙個正常的 channle,不是單向的
var ch2 chan<- float64 // ch2 是單向 channel,只用於寫 float64 資料
var ch3 <-chan int // ch3 是單向 channel,只用於讀取 int 資料
// * 管道的操作,一定要避免死鎖的情況。
----------------------------------------- channel 應用
// 此案例可以應用很多場景,每寫乙個,則可以消耗乙個// 此通道只能寫,不能讀
func producer(out chan<- int)
close(out)
}// 此通道只能讀,不能寫
func consumer(in <-chan int)
}func main()
----------------------------------------- timer
import ("time"
"fmt"
)func main()
----------------------------------------- select
// 註解:go語言提供了乙個關鍵字 select,通過 select 可以監聽 channel 上的資料流動// 語法:(類似 switch)
select
GO GOLANG程式設計師筆記大全
go 併發 註解 go 語言天生為程式併發所設計,可以說go的強項就是在cpu併發上的處理。go 語言層面就支援了併發。不是一般高階語言的多執行緒併發,是系統級真實併發 go 語言通過安全的通道傳送和接受資料以實現同步 一般情況下,乙個普通的桌面計算機跑十幾二十幾個執行緒就有點負載過大了,但是同樣的...
程式設計師筆記
一 程式設計基本概念 1.printf操作順序是從右向左,計算引數時,從右向左壓入堆疊。2.條件判斷 a a 優於 a a 因為會進行型別判斷,萬一錯寫 為 c 是不允許對常量賦值的。3.關於運算子方面的問題,不想去管,遊戲是乙個偏軟的東西。4.a,b兩個數,在不使用ifswitch等條件判斷語句中...
程式設計師 linux 命令詳解大全
你早晚都要學會得linux命令。stat命令檢視乙個檔案的屬性 訪問時間 access 修改時間 modify 狀態改變時間 change stat filename 查詢並刪除 data這個目錄7天前建立的檔案 find data ctime 7 exec rm rf find data ctim...