gpt4 book ai didi

golang中的goroutine一个进程错误

转载 作者:IT王子 更新时间:2023-10-29 01:05:08 26 4
gpt4 key购买 nike

我正在研究 golang。

在golang中,有一个概念,叫做goroutine。我写了一个示例代码。

package main

import (
"fmt"
"runtime"
)

func main() {
runtime.GOMAXPROCS(1) // cpu core를 하나만 사용하도록 해 놓음

s := "test string"

for i := 0; i < 100; i++ {
go func(n int) {
fmt.Println(s, n)
}(i)
}

fmt.Scanln()
}

如果你解释代码并运行,你会看到首先打印的数据是

测试字符串 99

我不知道为什么会这样。有人帮帮我吗?

最佳答案

是因为这一行:

runtime.GOMAXPROCS(1)

由于 goroutine 是一种并发执行代码的方式,因此您在循环中创建的所有 goroutine 都必须等待 proc。

因为你只有一个,而且它正忙于执行循环,所以你将有一堆 goroutine 在等待。

当循环结束时,proc 有时间执行第一个 goroutine,即最后创建的 goroutine,然后对 stack 一个一个地执行相同的操作,但这次是按顺序执行。

尝试放置 2 个过程,看看会发生什么。

请记住,当您以并发方式工作时,无法保证代码的执行顺序,正如评论中已经提到的那样。

这里你有一个序列,只是因为你只有一个进程。

如果您的目的是按顺序处理项目,即使是以并发方式,您也应该使用 channel 。

让我展示一个完成这项工作的代码示例:

主要包

import (
"fmt"
"runtime"
)

func printNumbers(text string, ns chan int) {
for n := range ns {
fmt.Println(text, n)
}
}

func main() {
runtime.GOMAXPROCS(1) // cpu core를 하나만 사용하도록 해 놓음

s := "test string"

numbers := make(chan int)

go printNumbers(s, numbers)

go func() {
for i := 0; i < 100; i++ {
numbers <- i
}
close(numbers)
}()

fmt.Scanln()
}

如您所见,这只是您的一个新版本,但如果您执行,您应该得到正确的顺序。

主要的变化是你现在有 2 个 goroutine,一个用于打印,一个用于循环。

2 个协程通过一个 int channel 进行对话。

当程序启动第一个 goroutin 调用函数 printNumbers 时,它会一直等待,直到有东西被写入 channel 。

然后开始第二个gorouting,将整数一个一个地写入 channel 。

一旦 for 结束,因为您只有 1 个进程,printNumbers 函数再次启动,因为 channel 内有项目。

它循环直到它结束 itmes。

当然,这里有 2 个循环,但您无法避免。

所以现在尝试按照您的意愿评估流程,看看会发生什么。

关于golang中的goroutine一个进程错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41500528/

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