# Go学习-Day8
文章目录
- Go学习-Day8
- 单元测试
- Goroutine
- 进程和线程
- 并发和并行
- Go协程和主线程
- MPG模式
- CPU相关
- 协程并行的资源竞争
Go学习-Day8
- 个人博客:CSDN博客
单元测试
-
testing框架会将xxx_test.go的文件引入,调用所有TestXxx的函数
-
在cal_test.go文件里面写这个
-
package mainimport "testing"func TestAdd(t *testing.T) {a, b := 1, 2if 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 TestAddcal_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! 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
-
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()//解锁之后,才能给别的协程使用
-
主线程读的时候也需要加锁,因为底层不知道协程已经解锁了,会发生资源冲突
-
但是这样不同协程之间没办法通讯,不知道什么时候协成完成任务了,白白空转浪费时间,或者提前结束主线程,终止协程,管道可能能解决这些问题,明天再学
相关文章:

# Go学习-Day8
文章目录 Go学习-Day8单元测试Goroutine进程和线程并发和并行Go协程和主线程MPG模式CPU相关协程并行的资源竞争 Go学习-Day8 个人博客:CSDN博客 单元测试 testing框架会将xxx_test.go的文件引入,调用所有TestXxx的函数 在cal_test.go文件里面写这个 …...

Maven编译java及解决程序包org.apache.logging.log4j不存在问题
1、首先新建一个文件夹,比如hello Hello里新建pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…...

【小吉测评】高效简洁的数据库管控平台—CloudQuery
文章目录 🎄CloudQuery是什么🛸CloudQuery支持的数据源类型🍔CloudQuery社区地址🌺如何使用🛸参考官方文档🛸参考视频教程🎈点击免费下载🎈立即下载即可🎈使用服务器完成…...

获取微信小程序二维码的bug
项目场景: 获取微信小程序二维码的bug,原来测试一直是没问题的,上线后也没啥问题,这次突然爆错 问题描述 access_token已失效或已过期 {"errcode":40001,"errmsg":"invalid credential, access_token is invalid…...

Linux之Shell(一)
Linux之Shell Shell概述Linux提供的Shell解析器bash和sh的关系Centos默认的解析器是bash Shell脚本入门脚本格式第一个脚本脚本常用的执行方式 变量系统预定义变量自定义变量特殊变量$n$#\$*、\$$? 运算符条件判断流程控制(▲)if判断case语句for循环while循环 read读取控制台输…...

解决拦截器抛出异常处理类的500状态码Html默认格式响应 !
解决方式 <mvc:annotation-driven><mvc:message-converters><!-- 配置JSON消息转换器 --><bean class"org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><property name"supportedMediaTypes"&…...

搭建PyTorch神经网络进行气温预测
import numpy as np import pandas as pd import matplotlib.pyplot as plt import torch import torch.optim as optim import warnings warnings.filterwarnings("ignore") %matplotlib inline features pd.read_csv(temps.csv)#看看数据长什么样子 features.he…...

Qt Creato配置PCL库
Qt Creator中使用PCL库_业务不精er的博客-CSDN博客 Qt6.1.0中配置pcl1.11.1_qt6导入pcl库_朽一的博客-CSDN博客 VS2017 中配置QTPCL显示点云或3D图形_pcl显示3d图tiff_桂林巡山的博客-CSDN博客 Windows10下QTVTKPCL环境配置(一次成功)_qt pcl_v俊逸的…...

从阿里到字节跳动,这3年外包做完,我这人生算是彻底废了......
我为什么一直做外包呢,原因是薪资和技术方面。 在阿里做了一年外包,薪资5k,功能测试,接触Linux和网络,但是说实在的技术很难沉淀,就像雾里看花一样,过年之后,想走的人都走了&…...

在汽车行业中如何脱颖而出?使用聊天机器人是关键
汽车行业正在经历一场非凡的技术革命,尖端技术重塑了其本质。汽车中的聊天机器人能作为一种改变游戏规则的技术脱颖而出,推动企业与客户互动甚至吸引新客户的方式的进步。例如SaleSmartly(SS客服)就是一个很优秀的聊天机器人平台。…...

Go语言最全面试题,拿offer全靠它,附带免积分下载pdf
面试题文档下链接点击这里免积分下载 go语言入门到精通点击这里免积分下载 文章目录 Go 基础类GO 语言当中 NEW 和 MAKE 有什么区别吗?PRINTF(),SPRINTF(),FPRINTF() 都是格式化输出,有什么不同?GO 语言当中数组和切片的区别是什么…...

虚拟机Linux20.04磁盘扩展
扩展之前必须要确保!没有快照! ps:先把快照删掉,如果担心弄坏的话可以先克隆一个 如果不删的话就会跟下面一样无法点击扩展: 删除了快照之后就可以点击这个【扩展】,输入你要的磁盘大小即可。 (我这里原…...

类欧几里得算法
求 ∑ i 0 n ⌊ a i b c ⌋ \sum\limits_{i0}^{n}\lfloor \frac{aib}{c} \rfloor i0∑n⌊caib⌋ 推式子步骤: 分类讨论 a 0 a0 a0 是个最简式子 b ≥ c b\ge c b≥c 或 a ≥ c a\ge c a≥c 由 f ( a m o d c , b m o d c , c , n ) f(a\bmod c,b\bmod…...

c++读取和存储文件,对文件操作
#include<bits/stdc.h> using namespace std; int aa[100];//全局变量数组,用来接收我们从文件中读取的数据。 void zhuanhua(string a){//这个函数的作用是转化我们读取的数字,由于我们读取文件时//是按行读取,就是一下读取一行&…...

InfluxDB API -- InfluxDB笔记四
1.调试工具的安装 ApiPost (类似Postman) 2.InfluxDB v2 API 地址 官方地址: InfluxDB v2 API | InfluxDB OSS 2.7 Documentation 本地文档地址:host1:8086/docs 3.token认证 在web UI 的Load Data -> API Tokens里面可以复制,这个页面也可以创…...

数据结构 - 单链表
文章目录 目录 文章目录 一、什么是链表? 线性表: 顺序表: 二、链表的分类和实现 分类: 实现: 1.创建节点类 2.创建单链表 1.addTail(尾增) 2.删除节点值为key的第一个节点 3.插入节点(在指定位置) 4.获取链表长度 总结 前言 大家好,这篇博客给大家讲一下什么是…...

化繁为简 面板式空调网关亮相上海智能家居展 智哪儿专访青岛中弘赵哲海
面对中央空调协议不开放和智能家居协议不统一的问题,青岛中弘选择中央空调控制器这一细分赛道入局智能家居市场,始终贯彻“所有空调,一个网关”的产品技术理念,逐渐探索出一条中弘的发展路径和商业模式。 在2023年的SSHT上海国际智…...

4G版本云音响设置教程阿里云平台版本
4G版本云音响设置教程介绍 第一章 介绍了在阿里云物联网平台生一个设备使用的三元素 第二章 转换阿里云三元素 为MQTT参数,并下载到设备中 第三章 阿里云物联网套件协议使用说明,如何发送数据至设备并播放 本文目录引导 目录 4G版本云音响设置教程介…...

STM32纯中断方式发送接收数据(串行通信;keil arm5;)
除了main文件其他文件均无修改,正常运行--在keil arm5内...

FPGA时序分析与约束(3)——时钟不确定性
一、前言 在之前的文章中,我们介绍了组合电路的时序和时序电路的时序问题,在阅读本文章之前,强烈推荐先阅读完本系列之前的文章,因为这是我们继续学习的理论的理论基础,前文链接: FPGA时序分析与约束&…...

【Java-HDFS】使用Java操作HDFS获取HDFS指定目录下的数据量大小
Maven依赖 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>RELEASE</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId>…...

协议定制 + Json序列化反序列化
文章目录 协议定制 Json序列化反序列化1. 再谈 "协议"1.1 结构化数据1.2 序列化和反序列化 2. 网络版计算器2.1 服务端2.2 协议定制(1) 网络发送和读取的正确理解(2) 协议定制的问题 2.3 客户端2.4 代码 3. Json实现序列化反序列化3.1 简单介绍3.2 使用 协议定制 J…...

系统架构设计师(第二版)学习笔记----系统架构概述
【原文链接】系统架构设计师(第二版)学习笔记----系统架构概述 文章目录 一、系统架构的定义与发展历程1.1 架构的定义1.2 架构设计的作用1.3 架构设计产生的背景1.4 软件架构的发展历程1.5 模块化开发方法1.6 模块法方法分解模块遵循的原则1.7 软件工程…...

FPGA基本算术运算
FPGA基本算术运算 FPGA基本算术运算1 有符号数与无符号数2 浮点数及定点数I、定点数的加减法II、定点数的乘除法 3 仿真验证i、加减法验证ii、乘除法验证 FPGA基本算术运算 FPGA相对于MCU有并行计算、算法效率较高等优势,但同样由于没有成型的FPU等MCU内含的浮点数运…...

Linux Input子系统
一、基本概念 按键、鼠标、键盘、触摸屏等都属于输入(input)设备,Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。本质属于字符设备。 1. input子系统结构如下: input 子系统分为 input 驱动层、input 核心层、input 事件处理层&…...

commet与websocket
commet与websocket Comet 前言 Comet是一种用于web的技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和iframe流。 实现方式 长轮询 长轮询是在打开一条连接以后保持&…...

python3 简易 http server:实现本地与远程服务器传大文件
在个人目录下创建新文件httpserver.py : vim httpserver.py文件内容为python3代码: # !/usr/bin/env python3 import datetime import email import html import http.server import io import mimetypes import os import posixpath import re import…...

Microsoft Edge 主页启动diy以及常用的扩展、收藏夹的网站
一、Microsoft Edge 主页启动diy 二、常用的扩展 1、去广告:uBlock Origin 2、翻译: 页面翻译:右键就有了,已经内置了划词翻译 3、超级复制 三、收藏夹的网站...

文末送书!谈谈原型模式在JAVA实战开发中的应用(附源码+面试题)
作者主页:Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,蓝桥云课认证讲师。 本文讲解了 Java 设计模式中的原型模式,并给…...

视频汇聚/视频云存储/视频监控管理平台EasyCVR启动时打印starting server:listen tcp,该如何解决?
视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码H.264、平台级联等。为了便于用户二次开发、调用与集成,…...