c语言多进程架构改go语言,golang多进程并发
前言
以前聽說什么golang一把梭什么的很厲害,到現(xiàn)在位置也接觸golang半個多月時間了,最主要的時間都是在看document,學習語法。golang什么的變量名大小寫區(qū)分公有私有神馬的太坑爹了。。。最近接觸到了golang最為稱贊的第一個地方:goroutine。本篇博客先介紹操作系統(tǒng)中的一些基本語法,然后介紹一下goroutine的美妙之處。
【線程, 進程】; 【多進程,多線程】; 【并發(fā),并行】
線程與進程概念線程:是程序執(zhí)行流的最小單元,是系統(tǒng)獨立調度和分配CPU(獨立運行)的基本單位。
進程:是資源分配的基本單位。一個進程包括多個線程
區(qū)別線程與資源分配無關,它屬于某一個進程,并與進程內的其他線程一起共享進程的資源。
每個進程都有自己一套獨立的資源(數(shù)據(jù)),供其內的所有線程共享。
不論是大小,開銷線程要更“輕量級”
一個進程內的線程通信比進程之間的通信更快速,有效。(因為共享變量)
多進程與多線程
多線程:同一時刻執(zhí)行多個線程。用瀏覽器一邊下載,一邊聽歌,一邊看視頻,一邊看網(wǎng)頁。。。
多進程:同時執(zhí)行多個程序。如,同事運行YY,QQ,以及各種瀏覽器。
并發(fā)與并行
并發(fā)當有多個線程在操作時,如果系統(tǒng)只有一個CPU,則它根本不可能真正同時進行一個以上的線程,它只能把CPU運行時間劃分成若干個時間段,再將時間 段分配給各個線程執(zhí)行,在一個時間段的線程代碼運行時,其它線程處于掛起狀。.這種方式我們稱之為并發(fā)(Concurrent)。
并行:當系統(tǒng)有一個以上CPU時,則線程的操作有可能非并發(fā)。當一個CPU執(zhí)行一個線程時,另一個CPU可以執(zhí)行另一個線程,兩個線程互不搶占CPU資源,可以同時進行,這種方式我們稱之為并行(Parallel)。
舉個例子:
并發(fā)就是一個窗口多條隊伍,多條隊伍輪流使用資源。
并行就是多個窗口,每個窗口一個隊伍,隊伍之間并行排隊。
gotuntine
golang語言中,用go關鍵詞就可以啟動并發(fā)程序。
我們先看一下下面這個簡單的例子,在main函數(shù)中依次調用了兩次loop函數(shù)。
func loop() {
for i := 0; i < 10; i++ {
fmt.Printf("%d", i)
}
}
func main() {
loop()
loop()
}
毫無疑問上述代碼的運行結果如下:
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
這個時候我們將main函數(shù)代碼換成如下
func main() {
go loop()
loop()
}
此時loop函數(shù)只運行了一次;這是什么原因呢,原來是因為我們的main函數(shù)中的第二個loop()執(zhí)行比較快
在go loop()還沒有執(zhí)行的時候,main函數(shù)已經(jīng)運行結束并且退出了。
0 1 2 3 4 5 6 7 8 9
我們可以使用time.Sleep設置延時來等待go loop()執(zhí)行,這種做法可行,但是顯然是不科學的,如果我的go loop()執(zhí)行很快結束了,而main函數(shù)還在等待,這顯然是一種資源上的浪費。
那么如何解決的,我們可以用下面的信道來解決這個問題
func main() {
go loop()
loop()
time.Sleep(time.Seoncd) //停頓一秒
}
信道
信道是什么?簡單的來說就是goruntine之間相互通訊的東西。類似Linux中的管道,用來在多個進程之間共享資源。
先看一下例子
func main() {
var chanel chan int = make(chan int) // 定義信道類型變量 chanel
go func(msg string) {
chanel
}("Ping")
msgStr :=
fmt.Println(msgStr)
}
在上述代碼中,我們通過定義chanel變量完成了進程間的消息通訊。
通過存消息和取消息兩種方法完成進程間的消息通訊。
通過這種方式我們可以控制進程的結束時間
var quit chan int = make(chan int)
func loop() {
for i := 0; i < 10; i++ {
fmt.Printf("%d ", i)
}
quit
}
func main() {
go loop()
loop()
}
我們通過quit來控制loop()的結束時間點,當quit沒有取到消息的時候,進程就會阻塞,main函數(shù)也就無法繼續(xù)執(zhí)行。
如果不用信道來阻塞主線的話,主線就會過早跑完,loop線都沒有機會執(zhí)行、、、
其實,無緩沖的信道永遠不會存儲數(shù)據(jù),只負責數(shù)據(jù)的流通,為什么這么講呢?
從無緩沖信道取數(shù)據(jù),必須要有數(shù)據(jù)流進來才可以,否則當前線阻塞
數(shù)據(jù)流入無緩沖信道, 如果沒有其他goroutine來拿走這個數(shù)據(jù),那么當前線阻塞
簡單來說就是必須有消息流入,并且有消息流出,缺一不可,不然會造成死鎖
后續(xù)
下一篇博客將會介紹一下死鎖以及等待多goruntine的方案
總結
以上是生活随笔為你收集整理的c语言多进程架构改go语言,golang多进程并发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 赵长江:腾势可以做到 80km/h的状态
- 下一篇: 第四届“华为影像&middo