1. 程式人生 > >Go語言的併發和並行

Go語言的併發和並行

package main

import (
    "fmt"
)

func loop(done chan bool) {
    for i := 0; i < 10; i++ {
        fmt.Print(i)
    }
    done <- true
}

func main() {
    done := make(chan bool)
    go loop(done)
    go loop(done)

    <-done
    <-done

}
複製程式碼

他的輸出結果: 01234567890123456789

go不是會新起一個goroutine來執行loop函式嗎。以前我們用執行緒去做類似任務的時候,系統的執行緒會搶佔式地輸出, 表現出來的是亂序地輸出。而goroutine為什麼是這樣輸出的呢?

關於並行和併發,下面這張圖說明:

  • 兩個佇列,一個Coffee機器,那是併發
  • 兩個佇列,兩個Coffee機器,那是並行

預設地, Go所有的goroutines只能在一個執行緒裡跑 。

如果當前goroutine不發生阻塞,它是不會讓出CPU給其他goroutine的, 所以上面的例子的輸出會是一個一個goroutine進行的

真正的並行

為了達到真正的並行,runtime.GOMAXPROCS(2)試試看

複製程式碼
package main

import (
    "fmt"
    "runtime"
)

func loop(done chan bool) {
    for
i := 0; i < 100; i++ { fmt.Printf("%d ", i) } done <- true } func main() { runtime.GOMAXPROCS(2) done := make(chan bool) go loop(done) go loop(done) <-done <-done }
複製程式碼

這下會看到兩個goroutine會搶佔式地輸出資料了。我們還可以這樣顯式地讓出CPU時間:

複製程式碼
package main

import (
    "fmt"
    "runtime"
)

func loop(done chan bool) {
    
for i := 0; i < 100; i++ { fmt.Printf("%d ", i) runtime.Gosched() //// 顯式地讓出CPU時間給其他goroutine } done <- true } func main() { // runtime.GOMAXPROCS(2) done := make(chan bool) go loop(done) go loop(done) <-done <-done }
複製程式碼

總結

我們從例子中可以看到,預設的, 所有goroutine會在一個原生執行緒裡跑

在同一個原生執行緒裡,如果當前goroutine不發生阻塞,它是不會讓出CPU時間給其他同線程的goroutines的,這是Go執行時對goroutine的排程,我們也可以使用runtime包來手工排程。

當一個goroutine發生阻塞,Go會自動地把與該goroutine處於同一系統執行緒的其他goroutines轉移到另一個系統執行緒上去,以使這些goroutines不阻塞

http://www.cnblogs.com/hupengcool/p/3993823.html

相關推薦

Go語言併發並行學習筆記(一)

如果不是我對真正並行的執行緒的追求,就不會認識到Go有多麼的迷人。 Go語言從語言層面上就支援了併發,這與其他語言大不一樣,不像以前我們要用Thread庫 來新建執行緒,還要用執行緒安全的佇列庫來共享資料。 以下是我入門的學習筆記。 Go語言的goroutines

Go語言併發並行

首先,並行!=併發, 兩者是不同的 Go語言的goroutines、通道和死鎖 goroutine Go語言中有個概念叫做goroutine, 這類似我們熟知的執行緒,但是更輕。 以下的程式,我們序列地去執行兩次loop函式: func loo

Go語言併發並行學習筆記(二)

Go語言的併發和並行 不知道你有沒有注意到一個現象,還是這段程式碼,如果我跑在兩個goroutines裡面的話: var quit chan int = make(chan int) func loop() { for i := 0; i < 10;

Go語言併發並行

package main import ( "fmt" ) func loop(done chan bool) { for i := 0; i < 10; i++ { fmt.Print(i) } done <

golang語言併發並行——goroutinechannel的詳細理解

轉載自: http://blog.csdn.net/skh2015java/article/details/60330785 http://blog.csdn.net/skh2015java/article/details/60330875

Go語言併發程式設計(二)

通道(channel) 單純地將函式併發執行是沒有意義的。函式與函式間需要交換資料才能體現併發執行函式的意義。雖然可以使用共享記憶體進行資料交換,但是共享記憶體在不同的goroutine中容易發生競態問題。為了保證資料交換的正確性,必須使用互斥量對記憶體進行加鎖,這種做法勢必造成效能問題。 Go語言提倡使

Go語言併發程式設計(三)

Telnet迴音伺服器 Telnet協議是TCP/IP協議族中的一種。它允許使用者(Telnet客戶端)通過一個協商過程與一個遠端裝置進行通訊。本例將使用一部分Telnet協議與伺服器進行通訊。 伺服器的網路庫為了完整展示自己的程式碼實現了完整的收發過程,一般比較傾向於使用傳送任意封包返回原資料的邏輯。這

Go語言併發程式設計(四)

同步 Go 程式可以使用通道進行多個 goroutine 間的資料交換,但這僅僅是資料同步中的一種方法。通道內部的實現依然使用了各種鎖,因此優雅程式碼的代價是效能。在某些輕量級的場合,原子訪問(atomic包)、互斥鎖(sync.Mutex)以及等待組(sync.WaitGroup)能最大程度滿足需求。

漫話:如何給女朋友解釋什麼是併發並行

某天下班後,我在家裡進行電話面試,問到面試者這樣一個問題:"能不能簡單介紹一下你理解的併發和並行,並說明一下他們之間的關係"。但是面試者回答的並不好,所以我在面試評價中寫到:"對併發和並行的概念不清楚"。這時,女朋友看到這句話。 併發和並行最開始都是作業系統中的概念,表示的是CPU執

go語言併發程式設計

一、goroutine 與傳統的系統級執行緒和程序相比,協程的大優勢在於其“輕量級”,可以輕鬆建立上百萬個而不會導致系統資源衰竭,而執行緒和程序通常多也不能超過1萬個。這也是協程也叫輕量級執行緒的原因。golang原生支援併發程式設計輕量級執行緒非搶佔式多工處理,由協程主動交出控制權編譯器/直譯器/虛

【鏈塊技術35期】區塊鏈技術語言——Go語言併發程式設計(上)

併發程式設計分為上、下兩節。這一節包括了併發程式設計的概述、goroutine和channel的部分內容。 一、概述 1.1 並行和併發 並行(parallel):在多個處理器上同時執行多條指令,如圖1所示。 併發(concurrency):同一時刻只有一條指令在

併發並行區別

1、首先並行和併發都是 能更有效的完成 多執行緒任務的 方式,但是兩者有一些區別。 2、兩者的主要區別在於是否 “同時” 進行多個任務。 簡單的說: 併發是交替做不同事物的能力。 並行是同時做不同事物的能力。 從主體上說: 併發是同一實體上的多個事件。如:一個老師交

併發程式設計(2)-程序、併發並行講解

概要: 程序 併發和並行 同步\非同步\阻塞\非阻塞 程序的建立、結束與併發的實現 一.程序講解   程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。在早期面向程序設計的計算機結構中,程

併發並行有什麼區別?

併發和並行有什麼區別? 做併發程式設計之前,必須首先理解什麼是併發,什麼是並行,什麼是併發程式設計,什麼是並行程式設計。 併發(concurrency)和並行(parallellism)是: 解釋一:並行是指兩個或者多個事件在同一時刻發生;而併發是指兩個或多個事件在同一時間間隔發生。 解釋二:

java高併發(一)基本概念:併發並行

併發和並行以前總是被我弄混,甚至以為是一樣的,但是現在發現並不是這樣 併發:實質為多工交替執行。微觀看為序列;因為cpu執行太快,巨集觀看,被認為是多個任務一起執行的。如圖:實線和虛線代表兩個不同的任務微觀上序列的執行著。如果系統為單核cpu,這時若有多個程序

Go語言學習應用

(1)楊輝三角形 package main import "fmt" //行數 const LINES int = 10 // 楊輝三角 func ShowYangHuiTriangle() { nums := []int{} for i := 0; i < LINES; i

一起來學GO語言--GO語言函式方法

這篇部落格一起學習一下函式和方法,一般來說這兩個是一樣的,但是在GO語言裡面,我理解是函式就是能被呼叫的方法,沒有固定的繫結在那個型別上面,而方法是繫結在某個特定型別上的函式。這是我的理解,如有錯誤,請大家指正。下面我們先從函式起。 1、函式的多值返回 我們知道從map中

GO學習之路(一)Go for win10基本環境的安裝(Go 語言下載安裝)

一、基本環境的安裝 1、下載安裝包http://www.golangtc.com/download,這是國內的地址,當然如果你有梯子的話,那就直接去官網下載。 這是我當初下載版本,可能速度回快些最新

併發並行的區別?

做併發程式設計之前,必須首先理解什麼是併發,什麼是並行,什麼是併發程式設計,什麼是並行程式設計。 併發(concurrency)和並行(parallellism)是: 解釋一:並行是指兩個或者多個事件在同一時刻發生;而併發是指兩個或多個事件在同一時間間隔發生。 解釋二:並行是在不同實體上

併發並行的區別

Erlang 之父 Joe Armstrong 用一張5歲小孩都能看懂的圖解釋了併發與並行的區別 併發是兩個佇列交替使用一臺咖啡機,並行是兩個佇列同時使用兩臺咖啡機。併發和並行都可以是多個執行緒,並