当前位置: 首页 > 面试题库 >

在相同goroutine中创建的goroutine是否总是按顺序执行?

齐意致
2023-03-14
问题内容
package main

func main() {
        c:=make(chan int)
        for i:=0; i<=100;i++ {
                i:=i
                go func() {
                        c<-i
                }() 
        }   
        for {
                b:=<-c
                println(b)
                if b==100 {
                        break
                }   
        }   
}

上面的代码创建了100个goroutine,将num插入到通道c,所以我只是想知道,这些goroutine是否会以随机顺序执行?在我的测试期间,输出将始终为1到100


问题答案:

严格来说,您观察到的“随机”行为是不确定性行为。

要了解此处发生的情况,请考虑通道的行为。在这种情况下,它有许多goroutine试图写入通道,而只有一个goroutine从通道中读出。

阅读过程只是顺序的,我们可以忽略它。

有许多并发写入过程,它们竞争访问共享资源(通道)。频道必须选择要接受的消息。

当通信顺序过程(CSP)网络做出 选择时 ,它引入了 不确定性 。在Go中,可以通过两种方式进行这种选择:

  • 同时访问一个通道的一端,以及
  • select 陈述。

您的情况是其中的第一个。

CSP是允许对并发行为进行分析和理解的代数。Roscoe和Hoare撰写的开创性著作“ Occam编程法则
https://www.cs.ox.ac.uk/files/3376/PRG53.pdf(类似的想法也适用于Go,尽管差异很小)。

令人惊讶的是,goroutine的并发执行是 完全确定的 。这是 只有当选择由 非确定性的用武之地。



 类似资料:
  • 问题内容: 来自:http : //blog.nindalf.com/how-goroutines-work/ 由于goroutine是协同调度的,因此不断循环的goroutine会使同一线程上的其他goroutine饿死。 Goroutine很便宜,并且如果被阻塞,不会导致对其进行复用的线程阻塞 网络输入 睡眠 渠道运营或 阻塞sync包中的原语。 因此,鉴于以上所述,假设您有一些类似这样的代码

  • 问题内容: 看起来字典的和方法返回的列表始终是一对一映射(假设在调用这两种方法之间字典没有改变)。 例如: 如果你没有在调用keys()和调用之间更改字典values(),那么假设上述for循环将始终显示True是否错误?我找不到任何证明文件。 问题答案: 发现了这一点: 如果,, ,和 被称为中间没有修改的字典,列表会直接对应。 在2.x文档和3.x文档上。

  • 问题内容: 我知道在Go中,会将goroutine绑定到一个OS线程,并且不允许其他goroutine在该线程中执行。儿童goroutine也是这样吗? 例如: 这两个goroutine是在单个和排他的OS线程中执行还是仅在第一个线程中执行? 问题答案: 文档的说: LockOSThread 将调用goroutine连接 到其当前的操作系统线程。在调用goroutine退出或调用UnlockOST

  • 问题内容: 在Google I / O 2012演示文稿 Go Concurrency Patterns中 ,Rob Pike提到了多个 goroutine 可以 驻留 在一个线程中。这是否意味着它们被实现为协程?如果没有,如何实施?欢迎使用源代码链接。 问题答案: 不完全的。Go常见问题解答部分 为什么使用goroutines而不是线程? 解释: Goroutine是使并发易于使用的一部分。这个

  • 问题内容: 如果我在http处理程序中启动goroutine,即使返回响应后它也会完成吗?这是一个示例代码: 在上面的示例中,goroutine是否会在所有情况下都完成?还是有什么特殊情况无法完成? 问题答案: 是的,它会完成,没有什么可以阻止它。 停止goroutine完成 “从外部” 完成的唯一事情就是从函数返回(这也意味着完成程序的执行,但是这种情况永远不会发生)。其他导致不稳定状态的情况,

  • 问题内容: Goroutines在通道上的阻塞顺序是否决定了它们将解除阻塞的顺序?我不关心所发送消息的顺序(它们一定会被排序),但是不会影响Goroutines的顺序。 想象一下在多个Goroutine(1、2和3)之间共享一个空通道,每个Goroutine都尝试在上接收消息。由于为空,每个Goroutine将阻塞。当我向发送消息时,Goroutine 1将首先解锁吗?还是2或3可能会收到第一条消