首页 > 其他分享 >Go语言入门13(runtime包)

Go语言入门13(runtime包)

时间:2023-04-30 09:12:05浏览次数:33  
标签:wg 13 01 协程 Test01 fmt Test02 Go runtime

Runtime包

GOMAXPROCS()

​ 用来设置可以并行计算的CPU核数最大值,并返回之前的值,具体使用方法上一篇有些,这里不再赘述

Gosched()

​ 用于让出CPU时间片,让出当前goroutine的执行权限,调度器安排其他等待的任务运行,并在下次某个时候从该位置恢复执行

Goexit()

​ 用于立即中止当前goroutine的运行(中止所在协程),而并不影响其他goroutine。⭐注意!Goexit()在中止当前协程前,还是会运行当前goroutine还没有执行的defer语句,切记,不允许在主函数调用Goexit(),会导致panic异常

举个栗子

// 定义两个函数,Test01和Test02
// Test02在Test01运行结束之后运行
// 并且Test02在i = 3的时候结束运行

//Test01
func Test01(wg *sync.WaitGroup) {
	defer func() {
		fmt.Println("Test01结束!")
		wg.Done()
	}()
	fmt.Println("协程01循环输出:")
	for i := 0; i < 5; i++ {
		fmt.Println("协程01 -", i)
	}
}
// Test02
func Test02(wg *sync.WaitGroup) {
	defer func() {
		fmt.Println("Test02结束!")
		wg.Done()
	}()
    // 等待Test01运行结束
	runtime.Gosched()
	fmt.Println("协程02循环输出:")
	for i := 0; i < 5; i++ {
		if i == 3 {
			fmt.Println("i = 3 退出!")
            // 当i = 3时执行defer里的语句然后退出
			runtime.Goexit()
		}
		fmt.Println("协程02 -", i)
	}
}
// main函数调用
func main() {
	var wg sync.WaitGroup
	wg.Add(2)
	go Test01(&wg)
	go Test02(&wg)
	wg.Wait()
	fmt.Println("This is main function!")
}
/*输出:
协程01循环输出:
协程01 - 0
协程01 - 1
协程01 - 2
协程01 - 3
协程01 - 4
Test01结束!
协程02循环输出:
协程02 - 0
协程02 - 1
协程02 - 2
i = 3 退出!
Test02结束!
This is main function!

*/

标签:wg,13,01,协程,Test01,fmt,Test02,Go,runtime
From: https://www.cnblogs.com/te9uila/p/17364897.html

相关文章

  • 轻量GIT服务器Gogs搭建教程(梭哈版)
    轻量GIT服务器Gogs搭建教程(梭哈版)Gogs(/gɑgz/)项目旨在打造一个以最简便的方式搭建简单、稳定和可扩展的自助Git服务。使用Go语言开发使得Gogs能够通过独立的二进制分发,并且支持Go语言支持的所有平台,包括Linux、macOS、Windows和基于ARM的操作系统。作者提供了多种......
  • mongodb基本使用
    mongodb基本使用1.mongodb不是关系型数据库,而是面向文档的数据库在mongo中,文档的键不是固定的,文档的键对应的值的数据类型也不是固定的。在mongo中,集合类似于关系型数据库中的表,文档类似于关系型数据库中的行。每个文档都有一个特殊的键‘_id’(由mongo创建),在它所属的集合中是唯......
  • 【模板方法设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介模板方法模式(TemplateMethodPattern)也叫模板模式,是一种行为型模式。它定义了一个抽象公开类,包含基本的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤。不同的子类以不同的方式实现这些抽象方法,从而对剩余的逻辑有......
  • Django笔记三十三之缓存操作
    本文首发于公众号:Hunter后端原文链接:Django笔记三十三之缓存操作这一节介绍一下如何在Django中使用redis做缓存操作。在Django中可以有很多种方式做缓存,比如数据库,比如服务器文件,或者内存,这里介绍用的比较多的使用redis作为缓存。这篇笔记主要内容如下:依赖安装se......
  • golang原生实现JWT
    golang原生实现JWTJWT(JSONWebToken)是一种基于JSON的安全令牌,可以用于在不同系统之间传输认证信息。在Go中实现JWT验证,可以通过标准库crypto/hmac、crypto/sha256和encoding/base64来编写自己的JWT。获取Token我们在此封装一个JWT的struct结构体(由于除了Payload,其他很大可能......
  • go语言channel
    go语言channel设计原理go语言中提倡:不要通过共享内存方式进行通信,而应该通过通信的方式共享内存。在很多编程语言中,多个线程传递数据的方式一般是共享内存,为了解决线程竞争,我们需要限制同一时间能够读写这些变量的线程数量,然而这与go语言的设计并不相同。虽然在go语言中也能使......
  • Python之路【第十七篇】:Django【进阶篇】
    原博客笔记链接:https://www.cnblogs.com/wupeiqi/articles/5246483.html 1.Model到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:创建数据库,设计表结构和字段使用MySQLdb来连接数据库,并编写数据访问层代码业务逻辑层去调用数据访问层执行数......
  • Python之路【第十六篇】:Django【基础篇】
    原博客教材链接:https://www.cnblogs.com/wupeiqi/articles/5237704.html Python的WEB框架有Django、Tornado、Flask等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM、模型绑定、模板引擎、缓存、Session等诸多功能。 1.基本配置1.1创建django程......
  • leetcode_D10_136只出现一次的数字
    1.题目 2.解一 leetcode官方解法,主要用到了两个知识:第一个是reduce函数,需要注意的是在python3中,需要通过“fromfunctoolsimportreduce”从模块中调用该函数;第二个知识是位运算中的异或运算,主要有以下计算法则。 有了这两个补充知识,该题目就很清晰了。3.解二 自......
  • Django基础(二)
    原博客笔记链接:https://www.cnblogs.com/wupeiqi/articles/4508271.html上节回顾web程序的生命周期MVC和MTV路由系统和自定义动态路由Model模版语言和simple_tag 7.Model连表操作指定映射连表条件一对一多对多#表结构#!/usr/bin/envpythoncl......