繁体   English   中英

一个过程和Golang中的Goroutine一样吗?

[英]Is a process the same as a Goroutine in Golang?

对于以下代码:

func main() {
    goRtns := runtime.NumGoroutine()
    fmt.Println("goroutines:", goRtns)
}

输出为1 但这是在一个“过程”中,没有明确调用goroutines:

“在计算中,进程是正在执行的计算机程序的实例。它包含程序代码及其当前活动。根据操作系统(OS),进程可以由执行的多个执行线程组成同时说明。“

还有来自Krishna Sundarram的优秀“How goroutines work”博客文章: http//blog.nindalf.com/how-goroutines-work/

“创建一个goroutine不需要太多内存 - 只有2kB的堆栈空间。它们通过根据需要分配和释放堆存储来增长。”

我的问题是,然后:正在运行的代码实例(我的简单main.go函数)被运行时库计为goroutine。 我是否假设父进程被视为go例程,具有相同的内存分配,垃圾收集等规则? 假设阅读一个关于goroutine执行的事实类似于运行它的总体进程是否明智? 关于上面关于goroutines的第二个引用,这听起来像一个程序在程序执行时增加/缩小其堆栈空间的过程,这是编程中的标准范例。

流程和例程是否共享相同的规则? 或者我只是遗漏了报道的goroutines数量。

一个过程和Golang中的Goroutine一样吗?

您在这里使用了错误的术语process 在GO中,一切都是goroutine。 正如沃尔克所说。 你可以从这里看到gouroutine的定义:

goroutine是由Go运行时管理的轻量级线程。

例如在你的代码中

func main() {
    goRtns := runtime.NumGoroutine()
    fmt.Println("goroutines:", goRtns)
}

这只有一个goroutine,因为它只有main功能,里面没有go调用这里。 它只是打印给定变量的东西。

如果您有另一个例子go在你的函数调用main

func main() {

    result := sq(sq(sq(gen(1, 2, 3, 4))))

    numGoroutines := runtime.NumGoroutine()
    fmt.Println("number goroutine = ", numGoroutines)

    fmt.Println(<-result)
    fmt.Println(<-result)
    fmt.Println(<-result)
    fmt.Println(<-result)

}

你可以在这里找到sq和gen功能。 现在runtime.NumGoroutine()将有5个gorutine。 由于内部函数gensq ,我们go打来电话,我们结合主题这里的总数是4 +的main最后的结果是5。

你必须小心Go中的术语过程 您引用了一个关于被称为进程的操作系统实体的定义,这些实体将被广泛认可。 很多人会理解这种用法​​。

但这个词过载了。 CAR Hoare的工作对我们也很重要:在他的通信顺序过程 (CSP)代数中,术语过程指的是一些小东西 - 更像是一个超轻量级的线程。 他的代数属于一类称为过程代数的数学。

因此,假设goroutine是Go的CSP 流程实现是公平的。

在这方面,围棋就像是一部陈旧的语言,奥卡姆。 在Occam中,流程意味着CSP流程。 Occam被广泛用于裸机(即无操作系统)嵌入式编程,因此在术语过程中从不存在任何歧义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM