首页 > 其他分享 >goroutine协程创建和使用

goroutine协程创建和使用

时间:2023-04-07 22:56:03浏览次数:30  
标签:协程 创建 fmt goroutine go Println main

前言:

协程的创建和使用,Go语言中使用goroutine非常简单,

只需要在调用函数的时候在前面加上go关键字,就可以为一个函数创建一个goroutine。

 

正文:

 

函数创建goroutine语法:

go 函数名( 参数列表 )

函数名:要调用的函数名。

参数列表:调用函数需要传入的参数。

 

 

goroutine 实例1:

func test() {

fmt.Println("test()", "hello test")

}

main调用:

go test() //增加go关键字,将test函数变为一个协程

fmt.Println("main()", "hello main")

//需要等待协程执行,不等待的话,有可能协程没有执行,程序就退出了

time.Sleep(time.Second)  

 

主程序main,执行完毕,所有开启的协程,也全部退出。所有有时候看到协程,并不会全部执行完毕。

 

goroutine执行流程

 

 

Runtime 包 GOMAXPROCS

Go运行时的调度器使用GOMAXPROCS参数来确定需要使用多少个OS线程来同时执行Go代码。

默认值是机器上的CPU核心数。

 

使用 runtime.NumCPU() 查询 CPU 数量

使用 runtime.GOMAXPROCS() 函数进行设置当前程序并发时占用的CPU逻辑核心数。

使用 runtime.NumGoroutine() 返回正在执行和排队的任务总数

使用:runtime.Gosched()  让出CPU时间片,重新等待安排任务

使用:runtime.Goexit()  退出当前 goroutine,不执行

 

多个goroutine交替执行示例:

两个协程交替执行

Go1.5版本之前,默认使用的是单核心执行。

Go1.5版本之后,默认使用全部的CPU逻辑核心

 

func test1() {
    for i := 1; i < 10; i++ {
        fmt.Println("test1()", i)
    }
}
func test2() {
    for i := 1; i < 10; i++ {
        fmt.Println("test2()", i)
    }
}

func main()  {
    runtime.GOMAXPROCS(1) //设置使用的cpu核心数,默认是全部核心
    go test1()
    go test2()
    //查看CPU数量
    fmt.Println(runtime.NumCPU())
    //查看正在执行和排队的协程总数 ,输出3
    fmt.Println(runtime.NumGoroutine())

    fmt.Println("main()", "hello main")
    time.Sleep(time.Second) //等待协程执行
}

 

 

sync.WaitGroup使用

 

当某个操作或是某个goroutine需要等待一批goroutine执行完毕以后才继续执行,

那么这种多线程(go里面说的线程就是goroutine)等待的问题就可以使用WaitGroup  

使用sync.WaitGroup来实现并发任务的同步

 

地址:https://go-zh.org/pkg/sync/

waitGroup实例1:

需要等待一批协程执行完毕,才可以执行后续操作,就无须使用 time.sleep函数,进行等待

var wg = sync.WaitGroup{} //WaitGroup初始化
func test1() {
    defer wg.Done()  //计数器减一
    for i := 1; i < 10; i++ {
        fmt.Println("test1()", i)
    }
}
func test2() {
    defer wg.Done() //计数器减一
    for i := 1; i < 10; i++ {
        fmt.Println("test2()", i)
    }
}

func main()  {
    wg.Add(2) //计数器设置2,表示创建2个协程等待
    go test1()
    go test2()
    wg.Wait()  //需要等待2个goroutine执行完毕以后才继续执行后续
    fmt.Println("main()", "hello main")
}

 

 

runtime.Gosched

让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,

因此当前线程未来会继续执行,在其他协程执行完毕后执行

 

实例1:让出线程,让其他线程运行

var wg = sync.WaitGroup{}
func test(n int) {
    defer wg.Done() 
    if n == 5 {
        runtime.Gosched() 
//让当前线程让出 cpu 以让其它协程运行,
//其他协程执行完毕才能继续运行当前协程
    }
    fmt.Println("test()", n)
}

main:
runtime.GOMAXPROCS(1) //设置使用的cpu核心数
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go test(i)
    }

    wg.Wait()
    fmt.Println("main()", "hello main")

输出结果:test() 5 总是在最后执行

完结

标签:协程,创建,fmt,goroutine,go,Println,main
From: https://www.cnblogs.com/ypeih/p/17297627.html

相关文章

  • oracle, mysql, clickhouse创建表的DDL语句参考
    这里展示的oracle,mysql,clickhouse下面如何创建一个表的DDL语句。请注意这里的数据类型,在不同的表,表示形式不一样。   Oracle的DDL语句 --UPCENTER.PUB_PLATE_INFOdefinitionCREATETABLE"UPCENTER"."PUB_PLATE_INFO"("ISVALID"NUMBER(1,0)NO......
  • 基于cpu和内存进行pod扩容,创建hpa
    基于cpu和内存进行pod扩容,创建hpa创建镜像mkdirphpcdphptouchdockerfiletouchindex.phpvimdockerfileFROMphp:5-apacheADDindex.php/var/www/html/index.phpRUNchmoda+rxindex.phpvimindex.php<?php$x=0.0001;for($i=0;$i<=1000000;$i++){......
  • PHP 通过创建临时表实现更高速的IN查询
    /***xmsb_fastIn通过创建临时表实现更高速的IN查询*@returnarray*/functionxmsb_fastIn($tb_name,//要执行in查询的表名$field_name,//要执行in查询的字段名$data_array,//in查询的条件数据集$not_i......
  • Azure OpenAI入门(一):创建Azure OpenAI服务与模型
    1.    打开Powershell,输入azlogin登录到Azure订阅。需要先安装AzureCLI,如果没安装请在https://learn.microsoft.com/zh-cn/cli/azure/?view=azure-cli-latest完成安装。 2.    用如下命令选择Azure订阅azaccountset--subscription <yoursubscriptionname>3. ......
  • 使用SQL语句创建数据库表
    为维护数据库的完整性,数据库管理系统必须能够实现如下功能:提供定义完整性约束条件的机制提供完整性检查的方法进行违约处理所以我们要使用规范的SQL语句来创建数据库表:在建表时声明主关键字和外关键字的约束名被参照表中的列必须是该表中的主关键字组成部分,否则ORACLE将......
  • Ubuntu创建用户-注意事项
    1、shell工具登陆后会有很多信息:修改/etc/pam.d/sshd和/etc/pam.d/login文件中的有pam_motd.so的行注释掉#sessionoptionalpam_motd.somotd=/run/motd.dynamicnoupdate#sessionoptionalpam_motd.so#[1]再次ssh,这次没有了上面的update等信息了......
  • 怎么在WPS表格中创建自定义函数
    1]环境win7的32位wps表格2019(11.8.2.10158)2]打开VB编辑器 新建模块函数   输入自定义函数,保存并关闭VB窗口Functionzz(ByValRngAsRange)AsIntegerzz=Rng+1EndFunction引用自定义函数    ......
  • ansible-galaxy命令快速创建角色框架
    在Ansible中创建角色,可以考虑使用ansible-galaxy命令快速创建角色框架。ansiblevsansible-galaxyAnsible是科幻小说银河系漫游指南中的一种超光速通讯工具,而Ansible社区的Galaxy就是类似类似dockerhub一样的存在,很多可以复用的角色(role),都在一个被称为AnsibleGalaxy的网站进......
  • 动态顺序表的创建
    建立头文件头文件名  SeqList.h1.构建一个结构体,结构体内的成员变量有,有效元素的个数size,该数组的容量capacity,存放数据所开辟动态空间的地址a。(a是指向动态开辟空间的指针)代码10-15行。2.创建接口动态顺序表需要完成增删查改等功能如图完整代码如下,内部也已标有注释SeqList.......
  • 创建私人仓库管理国外 lab
    创建私人仓库管理lab代码gitclonegit://g.csail.mit.edu/xv6-labs-2021cdxv6-labs-2021gitcheckoututilmakeqemu#github是可选的远程仓库名,由于origin被使用,此处用githubgitremoteaddgithubhttps://github.com/cong0221/6.S081.git#<token>要替换......