Concurrency 为什么我所谓的并行围棋程序不是并行的 主程序包 进口( “fmt” “运行时” “同步” ) var wg sync.WaitGroup func字母表(){ 对于char:='a';char

Concurrency 为什么我所谓的并行围棋程序不是并行的 主程序包 进口( “fmt” “运行时” “同步” ) var wg sync.WaitGroup func字母表(){ 对于char:='a';char,concurrency,go,parallel-processing,Concurrency,Go,Parallel Processing,我希望输出会混淆(因为没有更好的词),但相反;示例输出为: $go运行并行程序 开始围棋程序 等待完成 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 1 2 3 4 5 6 7 8 9 10 11 12 14 16 19 20 22 24 26 终止程序 我错过了什么 谢谢,你什么都不缺。它起作用了。这些调用没有“交错”(混合)出现,不是因为它们没有被并行化,而是因为它们发生得非常快 您可以轻松地添加一些对time.Sleep的调用,以更

我希望输出会混淆(因为没有更好的词),但相反;示例输出为:

$go运行并行程序

开始围棋程序 等待完成 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 1 2 3 4 5 6 7 8 9 10 11 12 14 16 19 20 22 24 26 终止程序

我错过了什么


谢谢,

你什么都不缺。它起作用了。这些调用没有“交错”(混合)出现,不是因为它们没有被并行化,而是因为它们发生得非常快

您可以轻松地添加一些对
time.Sleep
的调用,以更好地查看并行化。通过睡眠,我们100%知道打印字母表和数字应该是交错的

您的程序使用
Sleep
调用“强制”交错
主程序包
进口(
“fmt”
“同步”
“时间”
)
var wg sync.WaitGroup
func字母表(){
推迟工作组完成()
对于char:='a';char<'a'+26;char++{
fmt.Printf(“%c”,字符)
时间。睡眠(时间。秒*2)
}
}
func数(){
推迟工作组完成()
对于数字:=1;数字<27;数字++{
fmt.Printf(“%d”,编号)
时间。睡眠(时间。秒*3)
}    
}
func main(){
fmt.Println(“启动Go例程”)
工作组.添加(2)
go字母表()
go数字()
fmt.Println(“\n等待完成”)
wg.Wait()
fmt.Println(“\n终止程序”)
}
笔记 您可能已经知道这一点,但是设置
GOMAXPROCS
对该示例是否并行执行以及它消耗多少资源没有任何影响

GOMAXPROCS设置控制有多少操作系统线程试图同时执行代码。例如,如果GOMAXPROCS是4,那么程序一次只在4个操作系统线程上执行代码,即使有1000个goroutine。该限制不计算系统调用(如I/O)中阻塞的线程数


资料来源:

你是否有机会使用围棋场?当我在本地运行您的代码时,我得到:

package main

import (
    "fmt"
    "sync"
    "time"
)

var wg sync.WaitGroup

func alphabets() {
    defer wg.Done()
    for char := 'a'; char < 'a'+26; char++ {
        fmt.Printf("%c ", char)
        time.Sleep(time.Second * 2)
    }
}

func numbers() {
    defer wg.Done()
    for number := 1; number < 27; number++ {
        fmt.Printf("%d ", number)
        time.Sleep(time.Second * 3)
    }    
}

func main() {
    fmt.Println("Starting Go Routines")
    wg.Add(2)
    go alphabets()
    go numbers()

    fmt.Println("\nWaiting To Finish")
    wg.Wait()
    fmt.Println("\nTerminating Program")
}

操场在本质上是确定的。goroutine不会像以前那样频繁地让步,也不会在多个线程中运行。

可能第一个线程在另一个线程有机会开始之前完成。让它们跑得更长,你就会看到它们的平行性。
package main

import (
    "fmt"
    "sync"
    "time"
)

var wg sync.WaitGroup

func alphabets() {
    defer wg.Done()
    for char := 'a'; char < 'a'+26; char++ {
        fmt.Printf("%c ", char)
        time.Sleep(time.Second * 2)
    }
}

func numbers() {
    defer wg.Done()
    for number := 1; number < 27; number++ {
        fmt.Printf("%d ", number)
        time.Sleep(time.Second * 3)
    }    
}

func main() {
    fmt.Println("Starting Go Routines")
    wg.Add(2)
    go alphabets()
    go numbers()

    fmt.Println("\nWaiting 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 a 13 14 15 16 17 b 18 19 c 20 21 d 22 23 e 24 25 f 26 g h i j k l m n o p q r s t u v w x y z 
Terminating Program