Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
goroutine golang中的一个进程错误_Go_Goroutine - Fatal编程技术网

goroutine golang中的一个进程错误

goroutine golang中的一个进程错误,go,goroutine,Go,Goroutine,我正在学习有关戈朗的知识 在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)

我正在学习有关戈朗的知识

在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()
}
主程序包
进口(
“fmt”
“运行时”
)
func main(){
runtime.GOMAXPROCS(1)//cpu核心를 하나만 사용하도록 해 놓음
s:=“测试字符串”
对于i:=0;i<100;i++{
go func(n int){
fmt.Println(南、北)
}(一)
}
fmt.Scanln()
}
若您解释代码并运行,您将看到第一次打印数据是

测试字符串99


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

就是因为这句话:

runtime.GOMAXPROCS(1)
由于goroutine是一种并发执行代码的方法,所以在循环中创建的所有goroutine都必须等待proc

由于您只有一个,并且它正忙于执行循环,因此将有一堆goroutine等待

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

试着把2个进程,看看会发生什么

请记住,当您以并发方式工作时,代码的执行顺序并不能保证,正如注释中已经提到的那样

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

如果您的目的是让项目按顺序处理,即使是以并发方式处理,那么您应该使用通道

让我展示一个执行此任务的代码示例:

包干管

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()
}
导入(
“fmt”
“运行时”
)
func printNumber(文本字符串,ns chan int){
对于n:=范围ns{
fmt.Println(文本,n)
}
}
func main(){
runtime.GOMAXPROCS(1)//cpu核心를 하나만 사용하도록 해 놓음
s:=“测试字符串”
编号:=制造(成龙内部)
去打印数字(s,数字)
go func(){
对于i:=0;i<100;i++{

数字您的问题很好,答案基本上是内部运行时Go调度程序如何工作,但正如Mario Santini所说,执行顺序不能保证

用我有限的话来说,我可以告诉你,Go调度程序取决于内部使用的是哪种进程调度程序算法,它将决定执行的时间和每个goroutine请求运行的顺序,它还将根据需要为你创建OS线程,在你的情况下,你只限制为1个,所以它不会是所有的l、 所以很明显,最后一个goroutine很幸运地作为第一个运行它

我给您留下一些链接,提供更好的解释:


代码似乎打印出了您所期望的字符串:当处理线程和goroutine时,执行顺序不能保证,因此它们可以以任何顺序打印出来,这将是有效的。因此,对于我的代码,问题是第一个数据是不应该引起的最后一个数据。除了第一个数据之外,其他打印的数据都是正常的。所以我有一个问题。但我在阅读了下面的2个答案后理解了。谢谢你的评论。嗯。那个代码是我想要的。因为我想得到连续的结果。所以,我不认为代码不涉及问题。如果那个代码被删除,输出就不会像你说的那个样连续,因为使用了mulit Core谢谢,但我的意图是使用g一个进程核心并期望不使用通道的顺序结果。嗯。我理解你将要说的话。所以我很感激。你的解释对我来说和其他思考一样有意义。我认为更接近的答案在下面。我认为它与日程安排有关。再次感谢你的回答作为参考,直到Go lang 1.4,goroutine work sequentia是的。但是超过1.5并不能保证goroutine执行顺序。请参考^^@이형규 谢谢你的提醒。我已经安装了go 1.6.2,当前版本是1.7.4。所以1.4很旧,我没有考虑过。好的,当我说“执行顺序不保证”时,正是解释了为什么它首先执行创建的最后一个goroutine。:)作为go和goroutines的用户,这就是我们应该注意的