返回顶部
首页 > 资讯 > 精选 >使用通道时,goroutine 的执行顺序是什么?
  • 509
分享到

使用通道时,goroutine 的执行顺序是什么?

go语言 2024-02-09 14:02:28 509人浏览 泡泡鱼
摘要

PHP小编百草在这里给大家解答一个常见的问题:“使用通道时,Goroutine 的执行顺序是什么?”在Go语言中,goroutine是轻量级的线程,可以并发执行。当使用通道来进行协程间

PHP小编百草在这里给大家解答一个常见的问题:“使用通道时,Goroutine 的执行顺序是什么?”在Go语言中,goroutine是轻量级的线程,可以并发执行。当使用通道来进行协程间的通信时,通道的接收和发送操作是阻塞的,即它们会等待其他协程的操作完成。因此,当有多个goroutine同时操作一个通道时,它们的执行顺序是不确定的,取决于各个协程的调度情况。这就意味着,无法确定哪个goroutine会先执行,哪个会后执行,这由Go语言的调度器决定。

问题内容

使用通道时 goroutine 的执行顺序是什么?我认为写入或读取通道会停止当前的 goroutine。但我的测试代码不遵循此规则:

func main() {
    ch := make(chan int)
    go sum(ch, 3)
    fmt.Println("Write number: 10")
    ch <- 10
    fmt.Println("Write number: 20")
    ch <- 20
    fmt.Println("Write number: 30")
    ch <- 30

    fmt.Println("Finish main")
}

func sum(ch chan int, len int) {
    fmt.Println("Func 'sum' start")

    sum := 0
    for i := 0; i < len; i++ {
       fmt.Println("For start")
       num := <-ch
       fmt.Printf("Read from ch: %d\n", num)
       sum += num
       fmt.Println("For finish")
    }

    fmt.Printf("Sum: %d\n", sum)
}

我认为这个程序如何运作:

1.创建频道

2.创建一个goroutine(不启动,只初始化)

3.打印:写下数字:10

4.录制至10频道。定主要功能。

5.最主要的是被挡住了。启动 sum goroutine。

6.打印求和函数:Func 'sum' start

7.求和函数循环运行并打印:“To begin”

8.从“ch”读取数字 10 并打印:“Read from ch: 10”

9.下一步。打印:“完成”并继续下一次迭代。

10。打印:“开始于”并尝试写“with”。但通道是空的。停额,进入主线

...一次又一次。

然后我想看看:

Write number: 10
Func 'sum' start
For start
Read from ch: 10
For finish
For start
Write number: 20
Read from ch: 20
For finish
For start
Write number: 30
Read from ch: 30
For finish
Sum: 60
Finish main

但是,我看到:

Write number: 10
Func 'sum' start
For start
Read from ch: 10
For finish
For start
Write number: 20
Write number: 30
Read from ch: 20
For finish
For start
Read from ch: 30
For finish
Sum: 60
Finish main

这怎么可能?主函数向通道写入两次而不读取。

另外,如果您更改 for 中的调用次数:

go sum(ch, 2)

我不会收到错误。但没有人阅读最后一条消息

示例:在此消息之前。

解决方法

Goroutines 并发运行。在具有多个内核的系统上,它们可以并行运行。详细信息取决于 Go 运行时中的调度程序实现。出于所有意图和目的,除了通道通信等同步操作之外,事情都以随机顺序发生。

事实并非如此,也不是正在发生的事情(只要通道没有缓冲)。 Println 调用发生在发送操作之前,主 Goroutine 在打印后阻塞,直到 sum Goroutine 准备好接收。

是否看到“Read from ch: 30”打印出来也是随机的。相应的接收操作必须发生,因为 main 会被阻塞,直到它发生为止。然而,main 可能会在接收发生后在 Println 之前返回,并且当 main 返回时程序会立即终止,无论是否存在任何其他 goroutine。如果通道被缓冲,发生这种情况的可能性就会增加。

事实并非如此。如果只有两个接收总是导致死锁: https://go.dev/play/p/ qFVh529mkqR

以上就是使用通道时,goroutine 的执行顺序是什么?的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 使用通道时,goroutine 的执行顺序是什么?

本文链接: https://lsjlt.com/news/562601.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用通道时,goroutine 的执行顺序是什么?
    php小编百草在这里给大家解答一个常见的问题:“使用通道时,goroutine 的执行顺序是什么?”在Go语言中,goroutine是轻量级的线程,可以并发执行。当使用通道来进行协程间...
    99+
    2024-02-09
    go语言
  • mysql的执行顺序是什么
    mysql的执行顺序是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、执行顺序根据查询指定的表格,from计算笛卡尔积。on根据join_condition过滤数据。...
    99+
    2023-06-14
  • @Aspect@Order各个通知的执行顺序是什么
    小编给大家分享一下@Aspect@Order各个通知的执行顺序是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!@Aspect@Order各个通知的执行顺序两个...
    99+
    2023-06-29
  • golang defer的执行顺序是什么
    在Go语言中,defer语句用于注册延迟调用,延迟调用会在函数执行完毕后被执行,无论函数是正常返回还是发生异常。 当有多个defer...
    99+
    2023-10-22
    golang
  • golang init的执行顺序是什么
    在Go语言中,init()函数是一个特殊的函数,它会在程序运行时自动被调用,而不需要显式调用。 init()函数的执行顺序如下: ...
    99+
    2024-02-29
    golang
  • SQL查询的执行顺序是什么
    本篇内容主要讲解“SQL查询的执行顺序是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SQL查询的执行顺序是什么”吧!很多 SQL 查询都是以 SELEC&...
    99+
    2024-04-02
  • JS异步的执行顺序是什么
    这篇文章主要介绍“JS异步的执行顺序是什么”,在日常操作中,相信很多人在JS异步的执行顺序是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS异步的执行顺序是什么”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-07-02
  • oracle语句的执行顺序是什么
    在Oracle中,SQL语句的执行顺序通常如下: FROM子句:首先确定要查询的数据表,并进行必要的连接操作。 WHER&#...
    99+
    2024-04-09
    oracle
  • sql和mysql执行顺序是什么
    这篇文章主要介绍了sql和mysql执行顺序是什么,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。sql和mysql执行顺序,内部机制是一样的,最...
    99+
    2024-04-02
  • switch语句执行顺序是什么
    switch语句执行顺序是按照case标签的顺序进行判断,从上到下逐个比较。当找到与表达式匹配的case标签时,会执行该case标签...
    99+
    2023-09-16
    switch
  • where子句的执行顺序是什么
    本篇内容介绍了“where子句的执行顺序是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • java构造器的执行顺序是什么
    这篇文章给大家介绍java构造器的执行顺序是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1,在没有静态块的情况下,子类的对象创建时,父类的无参构造器-->子类的构造器(产生对象的构造器,如果是无参则执行的是...
    99+
    2023-06-17
  • java代码块的执行顺序是什么
    Java代码块的执行顺序如下: 静态代码块:静态代码块在类加载时执行,并且只执行一次。它用来初始化静态变量或执行一些只需执行一次...
    99+
    2023-10-24
    java
  • ​mysql中语句执行顺序是什么
    这篇文章给大家分享的是有关mysql中语句执行顺序是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操...
    99+
    2024-04-02
  • java过滤器执行顺序是什么
    Java过滤器的执行顺序是根据过滤器的配置顺序来确定的。在web.xml文件中,过滤器的配置顺序决定了它们的执行顺序。当一个请求被发...
    99+
    2023-08-11
    java
  • 回去等通知吧, 连sql的执行顺序都不知道?
    接下来再走一步,让我们看看一条SQL语句的前世今生。 首先看一下示例语句: SELECT DISTINCT < select_list > FROM < left_table > < join_type > JOIN < righ...
    99+
    2018-02-26
    回去等通知吧, 连sql的执行顺序都不知道? 数据库入门 数据库基础教程 数据库 mysql
  • PHP中for循环的执行顺序是什么
    本教程操作环境:windows7系统、PHP7.1版,DELL G3电脑for 循环是 PHP 中最复杂的循环结构。for 循环语句能够按照已知的循环次数进行循环操作,适用于明确知道执行次数的情况。for 循环的语法格式如下:for (初始...
    99+
    2016-02-26
    PHP for循环
  • C#类中方法的执行顺序是什么
    有些中级开发小伙伴还是搞不太明白在继承父类以及不同场景实例化的情况下,父类和子类的各种方法的执行顺序到底是什么,下面通过场景的举例来重新认识下方法的执行顺序: (下面内容涉及到了C#...
    99+
    2024-04-02
  • java中代码块的执行顺序是什么
    java中代码块的执行顺序是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java...
    99+
    2023-06-14
  • Angular生命周期执行的顺序是什么
    这篇文章主要介绍“Angular生命周期执行的顺序是什么”,在日常操作中,相信很多人在Angular生命周期执行的顺序是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Angular生命周期执行的顺序是什么...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作