首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Golang并联

Golang并联
EN

Stack Overflow用户
提问于 2017-08-20 16:49:26
回答 3查看 2.2K关注 0票数 0

我对Golang很陌生,并试图理解并发性和并行性。我阅读了下面提到的关于并发性和并行性的文章。我也执行过同样的程序。但没有得到相同的输出(混合字母和字符)。先得到所有的字母,然后是字符。似乎并发是起作用的,而不是并行的。

文章说,添加runtime.GOMAXPROCS(4)使并行。

为什么我没有得到并行的

我使用的是4核心CPU系统和GO 版本1.8.2

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

我知道,如果我们添加睡眠,那么我可以看到并行输出,按照并发的概念。但是并行性说,如果系统有多个CPU,那么每个线程将在一个CPU中运行,并成为并行进程。我在这里的问题是,为什么我没有得到并行输出,尽管我的系统有4个核心,并添加了runtime.GOMAXPROCS(4),.

Go程序

代码语言:javascript
复制
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")
}

我的输出

代码语言:javascript
复制
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

期望输出(不相同,但并行输出)

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-20 23:55:17

因为在我上面的例子中,for循环有条件27,所以程序执行速度快,不能看到并行性。我写了不同的例子,增加了条件,这样我就可以看到并行输出。

代码语言:javascript
复制
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()
}

更新8/28/2015: Go 1.5被设置为使GOMAXPROCS的默认值与计算机上的CPU数量相同。我删除了runtime.GOMAXPROCS(4)

票数 0
EN

Stack Overflow用户

发布于 2017-08-20 17:08:50

在我看来,在这段代码中有两个问题。第一个想法:

代码语言:javascript
复制
 runtime.GOMAXPROCS(2)

使用此行,您只允许两个工作人员,但您可以启动三个Go例程(Main需要一个)。

但主要的问题,去例行公事完成得太快。添加

代码语言:javascript
复制
time.Sleep(100000)

就能解决这个问题。包装主

代码语言:javascript
复制
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")
}

在本例中,我尝试不使用睡眠函数,因为它们会改变调度程序中的线程状态。因此我有了这个。

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2017-09-14 20:33:17

这是因为您的算法没有进行足够的操作来允许并行性。例如,尝试提高for语句的循环数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45784588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档