簡體   English   中英

Golang平行

[英]Golang Parallel

我是Golang的新手,試圖了解並發和並行。 我讀了下面提到的關於並發和並行的文章。 我已經執行了相同的程序。 但是沒有得到相同的(字母和字符混合)輸出。 首先獲取所有字母,然后獲取字符。 似乎並發無法正常工作並行不是。

文章說添加runtime.GOMAXPROCS(4)使其並行。

為什么我沒有平行發展

我正在使用4核CPU系統和GO 版本1.8.2

https://www.goinggo.net/2014/01/concurrency-goroutines-and-gomaxprocs.html

我知道,如果我們添加Sleep,那么根據並發性概念,我可以看到並行輸出。 但是Parallelism表示,如果系統具有多個CPU,則每個線程將在一個CPU中運行,並且成為並行進程。 我的問題是,盡管我的系統有4個核心並添加了runtime,但為什么我沒有得到並行輸出。GOMAXPROCS(4),。

去程序

package main

import (
    "fmt"
    "runtime"
    "sync"
)

func main() {
    runtime.GOMAXPROCS(2)

    var wg sync.WaitGroup
    wg.Add(2)

    fmt.Println("Starting Go Routines")
    go func() {
        defer wg.Done()

        for char := ‘a’; char < ‘a’+26; char++ {
            fmt.Printf("%c ", char)
        }
    }()

    go func() {
        defer wg.Done()

        for number := 1; number < 27; number++ {
            fmt.Printf("%d ", number)
        }
    }()

    fmt.Println("Waiting To Finish")
    wg.Wait()

    fmt.Println("\nTerminating Program")
}

我的輸出

Starting Go Routines
Waiting To Finish
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 a
b c d e f g h i j k l m n o p q r s t u v w x y z
Terminating Program

預期輸出 (不相同,但並行輸出)

Starting Go Routines
Waiting To Finish
a b 1 2 3 4 c d e f 5 g h 6 i 7 j 8 k 9 10 11 12 l m n o p q 13 r s 14
t 15 u v 16 w 17 x y 18 z 19 20 21 22 23 24 25 26
Terminating Program

由於在我上面的示例中for循環的條件為27,因此程序執行速度很快,並且看不到並行性。 我寫了不同的示例並增加了條件,然后才能看到Parallel輸出。

package main

import (
    "fmt"
    "runtime"
    "sync"
)

var wg sync.WaitGroup

func init() {
    fmt.Println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!", runtime.NumCPU())

}
func main() {
    fmt.Println(" Welcome to concurrency")
    wg.Add(2)
    go one()
    go two()
    fmt.Println("Waiting To Finish")
    wg.Wait()
    fmt.Println("\nTerminating Program")

}

func one() {
    for i := 0; i < 200; i++ {
        fmt.Println("one", i)
    }
    defer wg.Done()
}

func two() {
    for i := 0; i < 200; i++ {
        fmt.Println("Two:", i)
    }
    defer wg.Done()
}

UPDATE 8/28/2015:將Go 1.5設置為使GOMAXPROCS的默認值與計算機上的CPU數量相同。 我刪除了運行時。GOMAXPROCS(4)

我認為此代碼可能有兩個麻煩。 第一個想法:

 runtime.GOMAXPROCS(2)

使用這一行,您只允許兩個工作程序,但是您啟動了三個Go例程(Main需要一個)。

但是Go Routines完成的主要問題太快了。 新增中

time.Sleep(100000)

將解決這個問題。 包主

import (
    "fmt"
    "runtime"
    "sync"
)

func main() {
    runtime.GOMAXPROCS(3)

    var wg sync.WaitGroup
    wg.Add(2)

    fmt.Println("Starting Go Routines")
    go func() {
        defer wg.Done()
        for char := 'a'; char < 'a'+26; char++ {
            for i := 0; i < 10000; i++ {
                _ = i * 2
            }
            fmt.Printf("%c ", char)
        }
    }()

    go func() {
        defer wg.Done()
        for number := 1; number < 27; number++ {
            for i := 0; i < 10000; i++ {
                _ = i * 2
            }
            fmt.Printf("%d ", number)
        }
    }()

    fmt.Println("Waiting To Finish")
    wg.Wait()

    fmt.Println("\nTerminating Program")
}

在這種情況下,我嘗試不使用睡眠功能,因為它們會更改調度程序中的線程狀態。 結果就是這樣。

Starting Go Routines
Waiting To Finish
1 2 3 4 a 5 b 6 c d 7 8 e f 9 g h 10 i j 11 k 12 l m 13 n 14 o p q 15 r 16    s 17 t u 18 v 19 w 20 x y 21 z 22 23 24 25 26 
Terminating Program

那是因為您的算法執行的操作不足以允許看到並行性。 例如,嘗試增加for語句的循環數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM