Golang单元测试与Goroutine详解 | 并发、MPG模式及CPU利用

这篇具有很好参考价值的文章主要介绍了Golang单元测试与Goroutine详解 | 并发、MPG模式及CPU利用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

单元测试

  • testing框架会将xxx_test.go的文件引入,调用所有TestXxx的函数

  • 在cal_test.go文件里面写这个

  • package mainimport "testing"func TestAdd(t *testing.T) {
    	a, b := 1, 2
    	if add(a, b) != 4 {
    		t.Fatalf("Wrong Answer!")
    	}}

  • 在cal.go文件里写这个

  • package mainfunc add(a int, b int) int {
    	return a + b}

  • 运行go test -v的命令,就能运行单测

  • 可以得到结果

  • === RUN   TestAdd
        cal_test.go:8: Wrong Answer!--- FAIL: TestAdd (0.00s)

  • testing框架import这个test文件之后,会调用所有TestXxx的函数,注意大写!

Goroutine

进程和线程

  • 进程是程序的在操作系统的一次执行过程

  • 线程是比进程更小的单位,一个进程能创建销毁多个线程

  • 一个程序至少有一个进程,一个进程至少有一个线程

并发和并行

  • 多线程在单核上运行,就是并发

  • 多线程在多核上运行,就是并行

Go协程和主线程

  • 主线程类似进程

  • 协程类似线程,是轻量级的线程

  • 协程的特点

    • 有独立的空间

    • 共享程序的堆空间

    • 调度由用户控制

    • 协程是轻量级的线程

  • import (
    	"fmt"
    	"strconv"
    	"time")func test() {
    	for i := 0; i < 5; i++ {
    		fmt.Println("test() calls! " + strconv.Itoa(i))
    		time.Sleep(time.Second)
    	}}func main() {
    	go test()
    
    	for i := 0; i < 5; i++ {
    		fmt.Println("main() calls! " + strconv.Itoa(i))
    		time.Sleep(time.Second)
    	}}

  • 输出

  • main() calls! 0test() calls! 0test() calls! 1main() calls! 1main() calls! 2test() calls! 2test() calls! 3main() calls! 3main() calls! 4test() calls! 4

  • go关键字会另起一个协程,主线程执行到这里会开一个协程并行执行,如果主线程执行完毕退出,协程会被强制退出

MPG模式

  • M(Machine)是操作系统的主线程,也就是物理线程

  • P(Processor)协程执行的上下文

  • G(Gorountine)协程

  • Go语言的协程是轻量级的,是逻辑态的,可以起上万个协程;而C/java的多线程是内核态的,几千个就会耗光CPU

CPU相关

runtime.NumCPU()//获取本地CPU数目runtime.GOMAXPROCS(int)//设置GO最大可用的CPU数目//Go Max Processors

协程并行的资源竞争

  • 多个协程同时访问一个资源会发生冲突,会发生并发问题

  • 在java中我们有锁和原子类来保证并发安全

  • 声明一个全局锁变量lock

  • lock sync.Mutex//sync是同步的意思,Muti-excluded互斥锁?

  • lock.Lock()//在进行并发的读写操作的时候,先上个锁...//在进行操作的时候,别的协程会排队等待lock.Unlock()//解锁之后,才能给别的协程使用

  • 主线程读的时候也需要加锁,因为底层不知道协程已经解锁了,会发生资源冲突

  • 但是这样不同协程之间没办法通讯,不知道什么时候协成完成任务了,白白空转浪费时间,或者提前结束主线程,终止协程,管道可能能解决这些问题,明天再学文章来源地址https://www.toymoban.com/news/detail-686160.html

到了这里,关于Golang单元测试与Goroutine详解 | 并发、MPG模式及CPU利用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 7 文件操作、单元测试、goroutine【Go语言教程】

    1.1 介绍 os.File 封装所有文件相关操作,File 是一个结构体 常用方法: 打开文件 关闭文件 1.2 应用实例 ①读文件 常用方法: ①bufio.NewReader(), reader.ReadString【带缓冲】 ②io/ioutil【一次性读取,适用于小文件】 读取文件的内容并显示在终端(带缓冲区的方式),使用 os.Open, file.

    2024年02月04日
    浏览(43)
  • 【JAVA开发面试】如何处理并发访问如何进行代码的单元测试Java多线程编程消息中间件设计模式技术难题是如何解决的

    【 点我-这里送书 】 本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题 中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明

    2024年02月03日
    浏览(39)
  • Golang单元测试和压力测试

            go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程类似,并不需要学习新的语法,规则和工具。         go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go为后缀名的源代码文件都是go test测试的一部分,不会

    2024年04月27日
    浏览(21)
  • Golang 单元测试

    前言 单元测试是通过编写测试函数来完成的,这些函数位于_test.go文件中 步骤 要创建一个单元测试,你需要遵循以下步骤: 在与要测试的代码相同的包中创建一个新的文件,文件名以_test.go结尾 导入 testing 包 编写测试函数,函数名以 Test 开头,接受一个 *testing.T 类型的参数

    2024年01月16日
    浏览(23)
  • Golang单元测试举例

    cal.go  cal_test.go 说明:再GoLand中,要运行测试哪个函数可以自行选择 测试文件名必须以_test.go结尾; 测试方法的开头必须是Testxxx()  monster.go  monster_test.go

    2024年02月10日
    浏览(29)
  • golang学习-goroutine

    1、goroutine协程 goroutine 是 Go 语言支持并发的核心,一个goroutine会以一个很小的栈开始其生命周期,一般只需要2KB。区别于操作系统线程由系统内核进行调度, goroutine 是由Go运行时(runtime)负责调度。例如Go运行时会智能地将 m个goroutine 合理地分配给n个操作系统线程,实现类

    2024年01月18日
    浏览(26)
  • golang协程goroutine教程

    项目经常遇到一些批量任务执行太慢,需要开启多线程去处理,记录下在 Golang 中协程使用的一些操作。 协程是计算机程序的一类组件,推广了协作式多任务的子例程,允许执行被挂起与被恢复。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。

    2024年02月02日
    浏览(29)
  • golang Goroutine超时控制

     https://github.com/zeromicro/go-zero/blob/master/core/fx/timeout.go  一文搞懂 Go 超时控制_51CTO博客_go 超时处理

    2024年02月09日
    浏览(28)
  • Golang 并发编程详解

    并发是现代软件开发中的一个重要概念,它允许程序同时执行多个任务,提高系统的性能和响应能力。Golang 是一门天生支持并发的语言,它通过 goroutine 和 channel 提供了强大的并发编程支持。 在本文中,我们将深入探讨 Golang 中的并发编程,了解 goroutine、channel 以及一些常见

    2024年01月23日
    浏览(33)
  • Golang开发--Goroutine的使用

    Go 语言天生支持并发编程,提供了丰富的原语和工具来编写并发程序。Goroutine 是 Go 语言中的轻量级执行单位。它们是由 Go 运行时(runtime)管理的,并且能够在单个线程上运行成千上万个 Goroutine。创建 Goroutine 非常高效,可以通过使用 go 启动一个新的 Goroutine。例如,

    2024年02月09日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包