首页 > 其他分享 >golang 常用控制协程的三种方式

golang 常用控制协程的三种方式

时间:2023-06-24 10:00:16浏览次数:54  
标签:协程 context fmt golang 三种 func time go main

waitGroup

waitGroup这种方式适用于一个任务可以被拆分成几个子任务,并且子任务之间的关联程度不高,全部的子任务都完成,才会进行下一阶段的任务。

package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	var wg sync.WaitGroup

	wg.Add(3)

	go func() {
		defer wg.Done()
		time.Sleep(time.Second * 1)
		fmt.Println("任务1执行完成")
	}()
	go func() {
		defer wg.Done()
		time.Sleep(time.Second * 2)
		fmt.Println("任务2执行完成")
	}()
	go func() {
		defer wg.Done()
		time.Sleep(time.Second * 3)
		fmt.Println("任务3执行完成")
	}()

	wg.Wait()
	fmt.Println("全部任务执行完成")

}

channel

当满足某一种需要,通知协程不再继续工作的时候,就需要用到channel,channel主要应用于协程之间的通讯

package main

import (
	"fmt"
	"time"
)

func main() {
	var signal = make(chan struct{})

	go func() {
		for {
			select {
			case <-signal:
				fmt.Println("当前任务已停止")
				return
			case <-time.After(time.Second * 2):
				fmt.Println("任务执行中")
			}
		}
	}()

	time.Sleep(time.Second * 10)
	signal <- struct{}{}
	fmt.Println("exit")
}

context

当多个goroutine都需要控制结束,或者这些goriutine所衍生出来的goroutine也需要进行控制的时候就需要用到context,多层级goroutine之间的信号传播需要使用context。

package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	ctx, cancel := context.WithCancel(context.Background())
	go gOne(ctx, "任务一")
	time.Sleep(time.Second * 10)
	cancel()
	time.Sleep(time.Second * 2)
	fmt.Println("exit")
}

func gOne(ctx context.Context, name string) {
	go gTwo(ctx, "任务二")
	for {
		select {
		case <-ctx.Done():
			fmt.Println(name + ":任务已停止")
			return
		case <-time.After(time.Second * 1):
			fmt.Println(name + "任务执行中")
		}
	}
}

func gTwo(ctx context.Context, name string) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println(name + ":任务已停止")
			return
		case <-time.After(time.Second * 2):
			fmt.Println(name + "任务执行中")
		}
	}
}

标签:协程,context,fmt,golang,三种,func,time,go,main
From: https://www.cnblogs.com/xingzr/p/17500054.html

相关文章

  • GoLang在不同系统打包
    配置Mac下编译Linux,Windows平台的64位可执行程序:goenv-wCGO_ENABLED=0GOOS=linuxGOARCH=amd64goenv-wCGO_ENABLED=0GOOS=windowsGOARCH=amd64Linux下编译Mac,Windows平台的64位可执行程序:goenv-wCGO_ENABLED=0GOOS=darwinGOARCH=amd64goenv-wCGO_E......
  • GoLang图形用户界面编程实战(GUI编程)—fyne框架(一)
    一、前言GUI编程:图形用户界面编程。使用fyne框架实现。ps(目的)====>>ps,美图秀秀GUI=========>>fyne框架msys2模拟linux,在msys2中安装fyne框架二、安装msys2(win模拟linux)下载地址1(阿里镜像):https://mirrors.aliyun.com/msys2/distrib/x86_64/?spm=a2c6h.25603864.0.0.4e6c1484CbwZd......
  • golang 给对象的基础数据类型的指针类型的属性赋值
    概要有时我们可能碰到定义成下面这样的结构体,结构体里某些属性是基础数据类型,更确切的说,是基础数据类型的指针类型。typeStudentstruct{ namestring`json:"name"` age*int`json:"age"`//age是整型指针}不可行的写法此时该如何对这种成员属性进行赋值呢,下面......
  • golang 的 sync.WaitGroup
    WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。官方对它的说明如下:AWaitGroupwaitsforacollectionofgoroutinestofinish.ThemaingoroutinecallsAddtosetthenumberofgoroutinestowaitfor.Thenea......
  • Golang 做的几个跟性能有关的工具
    1、Vegetahttps://github.com/tsenart/vegetaVegeta是一个万能的HTTP负载测试工具,提供命令行工具和一个开发包。使用方法:$vegetaattack-hUsageofattack:-duration=10s:Durationofthetest-header=:Targetsrequestheader-ordering="random":Attackorderi......
  • win下 golang 跨平台编译
    本篇文章是win下的跨平台编译。安装GCC编译器(MinGW)我们需要GCC编译环境,这里我选择的是:MinGW。mac下安装了Xcode自动就带了GCC,win下没有,所以我们用MinGW这个最小化安装的GCC。MinGW官网提供了一种自动在线下载安装的gui小程序,http://sourceforge.net/projects/mingw/files/Install......
  • Golang 中文转拼音
    翻遍整个GitHub,Golang中文转拼音类库,怎么就这么难找呢?于是我造了一个轮子:中文转拼音类库.目前来说应该是最好用的了.GitHub传送门:https://github.com/Lofanmi/pinyin-golang如果说基于汉字拼音字典,逐个汉字替换,也是可以转换的,但是碰到多音字就很麻烦了.而......
  • Kotlin协程:Flow基础原理
    本文分析示例代码如下:launch(Dispatchers.Main){flow{emit(1)emit(2)}.collect{delay(1000)withContext(Dispatchers.IO){Log.d("liduo","$it")}Log.d("liduo",&......
  • Golang如何优雅地关闭 channel
    Golang如何优雅地关闭channel萧瑟 golang面试经典讲解 2023-05-3121:00 发表于上海一、介绍想必听说过go的,应该都知道go的最大的特性goroutine并发编程,而说到并发编程,使用channel进行数据传输是go中的必修课。go的并发哲学:不要通过共享内存来通信,而要通过通......
  • golang的位运算
    二进制字节位的几个操作例子:0110&1011=0010//与AND都为10110|1011=1111//或OR至少一个为10110^1011=1101//异或XOR只能一个为10110&^1011=0100//位清除ANDNOT清除标志位,不都为1a&^b的意思就是清零a中,ab都为1......