首页 > 其他分享 >Golang中如何控制goroutine的执行顺序?

Golang中如何控制goroutine的执行顺序?

时间:2023-06-07 14:44:22浏览次数:42  
标签:顺序 协程 goroutine chan Golang func go channel

首先说明一下原理:前后协程之间通过通道去相互限制,后一个线程尝试去获取一个channel的值,当channel中没有值时,就会一直阻塞,而前一个协程则负责关闭channel,当前一个协程完成了这个操作,后一个协程才可以结束阻塞,继续执行。

示例代码:

package main

import (
	"fmt"
	"time"
)

func main() {
	newChan1 := make(chan int)
	newChan2 := make(chan int)
	newChan3 := make(chan int)
	go func() {
		fmt.Println("goroutine 1")
		close(newChan1)
	}()
	go func() {
		<-newChan1
		fmt.Println("goroutine 2")
		close(newChan2)
	}()
	go func() {
		<-newChan2
		fmt.Println("goroutine 3")
		close(newChan3)
	}()
	time.Sleep(time.Second)
}

输出结果:

示例代码中,我们开启了三个协程,初始化了三个channel,每一个goroutine尝试获取前一个channel里的元素,然后当前goroutine则关闭这个channel,让后面的去读这个gouroutine,因为go语言允许读一个关闭的channel的,所以我们可以利用这个特性来使goroutine按照顺序执行,如果有更好的方法,欢迎评论区交流!!!

标签:顺序,协程,goroutine,chan,Golang,func,go,channel
From: https://www.cnblogs.com/99kol/p/17463263.html

相关文章

  • 文件读取顺序差异
    Linux(Ubuntu):Windows:......
  • 算法 in Golang:Quicksort(快速排序)
    算法inGolang:Quicksort(快速排序)Quicksort(快速排序)快速排序O(nlog2^n),比选择排序要快O(n²)在日常生活中经常使用使用了D&C策略(分而治之)使用Quicksort排序数组不需要排序的数组(也就是BaseCase基线条件):[],空数组[s],单元素数组很容易排序的数组:[a,b],两......
  • 算法 in Golang:Recursion(递归)
    算法inGolang:Recursion(递归)递归算法场景:在套娃中找到宝石可以这样做while没找到:if当前项is宝石:return宝石elseif当前项is套娃:打开这个套娃if当前项is宝石:return宝石elseif当前项is套娃:打开这个套娃if当前项is宝石:............
  • 20个Golang片段让我不再健忘
    前言本文使用代码片段的形式来解释在 go 语言开发中经常遇到的小功能点,由于本人主要使用 java 开发,因此会与其作比较,希望对大家有所帮助。1.helloworld新手村的第一课,毋庸置疑。packagemainimport"fmt"funcmain(){ fmt.Printf("helloworld")}2.隐形初始......
  • golang中for select时,如果channel关闭会怎么样?
    首先,如果对于一个已经关闭的channel来说,如果此时channel里还有值,则会正确读到channel里的值,且返回的第二个bool值为true;如果关闭前,channel里的值已经被读完,则最后返回的则是channel的零值;那么针对该问题,我们通过代码来验证一下:packagemainimport( "fmt" "time")constt......
  • golang之context
    Golang之Context:提升代码性能的关键在当今数字化世界中,高效的编程语言对于开发人员来说至关重要。Golang作为一种现代化且强大的编程语言,已经在业界迅速崛起,并受到了广泛的关注和采用。Golang以其简洁、高效和并发性能出色而闻名,但是在开发大规模应用时,开发人员必须了解如何优化代......
  • 20个Golang片段让我不再健忘 | 京东云技术团队
    前言本文使用代码片段的形式来解释在 go 语言开发中经常遇到的小功能点,由于本人主要使用 java 开发,因此会与其作比较,希望对大家有所帮助。1.helloworld新手村的第一课,毋庸置疑。packagemainimport"fmt"funcmain(){ fmt.Printf("helloworld")}2.隐形初始化package......
  • Golang高性能编程--slice的学习总结
    在go语言中,数组变量属于值类型,因此当一个数组变量被复制或者传递时,实际上会复制整个数组。eg,将a赋值给b,修改a中的元素,并不会修改b中的元素。为了避免复制数组,一般会传递指向数组的指针。packagemainimport"fmt"funcmain(){ a:=[...]int{1,2,3} b:=a a[0]=100......
  • 顺序表 与 链表 的优缺点比较涅~( ̄▽ ̄)~*
    顺序表  优点是可以随机存取元素,存储密度高,结构简单;        缺点是需要一片地址连续的存储空间,不便于插入和删除元素(因为插入需要将大量的元素向后移动,删除需要将后续大量的元素向前覆盖),表的容量难以确定; 链表   优点是便于结点的插入与删除(只需要修......
  • Verilog 顺序块、并行块,阻塞过程赋值、非阻塞过程赋值的区别
    顺序块:顺序块中的语句执行都是从上到下顺序执行,和C语言执行过程一样,关键词是begin、end。initialbegin//顺序块关键字 tb_sel=1'b0; #5tb_in1=1'b1;//时刻5执行 #10tb_in2=1'b1;//时刻15执行 #20tb_sel=1'b1;//时刻35执行end编辑 上图为顺序块仿真时序图,可以看......