gpt4 book ai didi

concurrency - goroutines 导致严重的减速和头痛

转载 作者:IT王子 更新时间:2023-10-29 01:48:56 27 4
gpt4 key购买 nike

我在使用 goroutines 时遇到了一些问题。为什么这段代码的执行时间约为 125 毫秒(请注意顺序执行):

package main

import (
"os/exec"
"time"
"fmt"
)

func main() {
cmd := exec.Command("lessc", "--yui-compress", "test.less")
n := 2000
start := time.Now()
for i := 0; i < n; i++ {
cmd.Run()
}
finish := time.Now()

fmt.Printf("Program took %v to run\n", finish.Sub(start))
}

当这段代码大约需要 20 秒时(使用 goroutines 并发执行):

package main

import (
"os/exec"
"time"
"fmt"
)

func main() {
cmd := exec.Command("lessc", "--yui-compress", "test.less")
ch := make(chan bool)
n := 2000
start := time.Now()
for i := 0; i < n; i++ {
go lessc(ch, cmd)
}
fmt.Println(n, " goroutines started.")
for i := 0; i < n; i++ {
_ = <-ch
}
finish := time.Now()

fmt.Printf("Program took %v to run\n", finish.Sub(start))
}

func lessc(ch chan bool, c *exec.Cmd) {

c.Run()
ch <- true
}

在 i7 720QM (4C/8T) 8GB RAM linux/x86-64 上使用 go 1.0.3还使用 1.0.2 构建和测试,并在同一台机器上遇到同样的问题。

编辑:由下面的@jnml 解决。如果有人关心这里新的固定并发代码,那就是:

package main

import (
"os/exec"
"time"
"fmt"
)

func main() {
ch := make(chan bool)
n := 2000
start := time.Now()
for i := 0; i < n; i++ {
go lessc(ch)
}
fmt.Println(n, " goroutines started.")
for i := 0; i < n; i++ {
_ = <-ch
}
finish := time.Now()

fmt.Printf("Program took %v to run\n", finish.Sub(start))
}

func lessc(ch chan bool) {

cmd := exec.Command("lessc", "--yui-compress", "test.less")
cmd.Run()
ch <- true
}

最佳答案

IMO 你的程序不正确。它包含竞争条件,因此几乎可以做任何事情。它的任何时间都没有意义。

您正在创建 一个 exec.Cmd,然后同时(== 数据竞争)从多个 goroutine 执行其 Run 方法。 exec.Cmd 从未提及它可以多次重复使用 Run - 即使是连续的。

exec.Cmd 有一些由 exec.Command 初始化的状态和执行 Run 后的不同状态。 IOW,执行 Run 方法后,状态不再初始化,可能不适合另一个 Run

关于concurrency - goroutines 导致严重的减速和头痛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16057524/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com