码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • # Go学习-Day8


    文章目录

    • Go学习-Day8
      • 单元测试
      • Goroutine
        • 进程和线程
        • 并发和并行
        • Go协程和主线程
        • MPG模式
        • CPU相关
        • 协程并行的资源竞争

    Go学习-Day8

    • 个人博客:CSDN博客

    单元测试

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

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

    • package main
      
      import "testing"
      
      func TestAdd(t *testing.T) {
      	a, b := 1, 2
      	if add(a, b) != 4 {
      		t.Fatalf("Wrong Answer!")
      	}
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
    • 在cal.go文件里写这个

    • package main
      
      func add(a int, b int) int {
      	return a + b
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • 运行go test -v的命令,就能运行单测

    • 可以得到结果

    • === RUN   TestAdd
          cal_test.go:8: Wrong Answer!
      --- FAIL: TestAdd (0.00s)
      
      
      • 1
      • 2
      • 3
      • 4
    • 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)
      	}
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
    • 输出

    • main() calls! 0
      test() calls! 0
      test() calls! 1
      main() calls! 1
      main() calls! 2
      test() calls! 2
      test() calls! 3
      main() calls! 3
      main() calls! 4
      test() calls! 4
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    • go关键字会另起一个协程,主线程执行到这里会开一个协程并行执行,如果主线程执行完毕退出,协程会被强制退出

    MPG模式

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

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

    • G(Gorountine)协程

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

    CPU相关

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

    协程并行的资源竞争

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

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

    • 声明一个全局锁变量lock

    • lock sync.Mutex
      //sync是同步的意思,Muti-excluded互斥锁?
      
      • 1
      • 2
    • lock.Lock()//在进行并发的读写操作的时候,先上个锁
      ...//在进行操作的时候,别的协程会排队等待
      lock.Unlock()//解锁之后,才能给别的协程使用
      
      • 1
      • 2
      • 3
    • 主线程读的时候也需要加锁,因为底层不知道协程已经解锁了,会发生资源冲突

    • 但是这样不同协程之间没办法通讯,不知道什么时候协成完成任务了,白白空转浪费时间,或者提前结束主线程,终止协程,管道可能能解决这些问题,明天再学

  • 相关阅读:
    如何在linux服务器上安装Anaconda与pytorch
    基于JavaSwing开发麻雀捉小鸡游戏+论文: (大作业/毕业设计)
    Pandas时间序列、时间戳对象、类型转换、时间序列提取、筛选、重采样、窗口滑动
    vue 在使用post提交json数据、表单数据,object数据,解决方案
    【数据分享】2022年全国各城市公交线路与站点数据
    python requests 最牛攻略
    NLP(1)--NLP基础与自注意力机制
    浔川身份证号码查询——浔川python科技社
    CIKM 2022 AnalytiCup Competition: 联邦异质任务学习
    石油化工行业商业供应链管理系统:大数据支撑,打造高质量可视化供应链
  • 原文地址:https://blog.csdn.net/gfyy_bkj/article/details/132528675
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号