获得徽章 0
#青训营 x 字节后端训练营# 不必要的阻塞是什么意思?首先,线性阻塞是指线程因为要等待某些条件(互斥元、条件变量、时间等)无法继续运行时所处的状态。多线程代码中,常用]些条件,而这些条件常常无法获得满足,因此就出现了不必要的阻塞问题。我们着又会提出下一个问题:为什么这个阻塞是不必要的?因为有其他一些线程在等该阻塞的线程执行一些动作,如果该线程阻塞的话,其他线程也势必阻塞。不必的阻塞又分成以下几种。 不必要的阻塞 活锁——当第一个线程等待第二个线程时,而这第二个线程又在等第一个线)情况时,活锁类似于死锁。活锁与死锁的关键不同在于等待过程不是一个阻;状态而是一个不断的循环检测状态,如自旋锁。严重时,活锁的症状就像死(应用不会执行任何进程),不同仅在于 CPU此时的利用率非常的高,因为现;还在不断的运行检测,只因相互等待而阻塞。不太严重时,当某个随机事件;生时,活锁可能会被解锁,但是,活锁会导致任务较长时间得不到执行,并!在这期间 CPU利用率高。
展开
评论
点赞
#青训营 x 字节后端训练营# 1、首先安装anaconda
Anaconda是一个基于Python的数据处理和科学计算平台集成环境,它内置了许多非常有用的第三方库,装上Anaconda,就相当于把Python和一些如Numpy、Pandas、Scrip、Matplotlib等常用的库自动安装好了。
Anaconda在官网下载安装就行。(
www.anaconda.com)
如果国外下载太慢,可以用清华源。
(
mirrors.tuna.tsinghua.edu.cn)
2、查看conda版本:
conda --version
3、查看所有环境:
conda info --envs
4、创建一个环境:
conda create -n pytorch python=3.6 #3.6是我python版本,pytorch是环境名称name
环境之间的关系,像进入另一个房子
5、进入环境:
conda activate pytorch
左边变化成新环境
6、去pytorch官网使用官方的安装命令:
Anaconda是一个基于Python的数据处理和科学计算平台集成环境,它内置了许多非常有用的第三方库,装上Anaconda,就相当于把Python和一些如Numpy、Pandas、Scrip、Matplotlib等常用的库自动安装好了。
Anaconda在官网下载安装就行。(
如果国外下载太慢,可以用清华源。
(
2、查看conda版本:
conda --version
3、查看所有环境:
conda info --envs
4、创建一个环境:
conda create -n pytorch python=3.6 #3.6是我python版本,pytorch是环境名称name
环境之间的关系,像进入另一个房子
5、进入环境:
conda activate pytorch
左边变化成新环境
6、去pytorch官网使用官方的安装命令:
展开
评论
点赞
#青训营 x 字节后端训练营# 主键索引(聚簇索引)查询过程
select * from product where id=5;
在根节点(磁盘块1)索引查找(一次磁盘 I/O 操作)
在第二层(磁盘块2)索引数据查找(一次磁盘 I/O 操作)
在叶子节点(磁盘块N)索引数据查找(一次磁盘 I/O 操作)
二级索引(辅助索引)查询过程
当查询语句select * from product where product_no = '0002';由于字段product_no不是主键,需要先查询二级索引中的B+Tree索引值,获取主键值,通过该主键值,主键索引查询对应叶子节点获取数据。
回表:二级索引查询两个B+Tree过程。
索引覆盖:当查询数据能在二级索引的B+Tree叶子节点中查询到,比如:select id from product where product_no ='0002' # 直接查询主键id;主键索引(聚簇索引)查询过程
select * from product where id=5;
在根节点(磁盘块1)索引查找(一次磁盘 I/O 操作)
在第二层(磁盘块2)索引数据查找(一次磁盘 I/O 操作)
在叶子节点(磁盘块N)索引数据查找(一次磁盘 I/O 操作)
二级索引(辅助索引)查询过程
当查询语句select * from product where product_no = '0002';由于字段product_no不是主键,需要先查询二级索引中的B+Tree索引值,获取主键值,通过该主键值,主键索引查询对应叶子节点获取数据。
回表:二级索引查询两个B+Tree过程。
索引覆盖:当查询数据能在二级索引的B+Tree叶子节点中查询到,比如:select id from product where product_no ='0002' # 直接查询主键id;
select * from product where id=5;
在根节点(磁盘块1)索引查找(一次磁盘 I/O 操作)
在第二层(磁盘块2)索引数据查找(一次磁盘 I/O 操作)
在叶子节点(磁盘块N)索引数据查找(一次磁盘 I/O 操作)
二级索引(辅助索引)查询过程
当查询语句select * from product where product_no = '0002';由于字段product_no不是主键,需要先查询二级索引中的B+Tree索引值,获取主键值,通过该主键值,主键索引查询对应叶子节点获取数据。
回表:二级索引查询两个B+Tree过程。
索引覆盖:当查询数据能在二级索引的B+Tree叶子节点中查询到,比如:select id from product where product_no ='0002' # 直接查询主键id;主键索引(聚簇索引)查询过程
select * from product where id=5;
在根节点(磁盘块1)索引查找(一次磁盘 I/O 操作)
在第二层(磁盘块2)索引数据查找(一次磁盘 I/O 操作)
在叶子节点(磁盘块N)索引数据查找(一次磁盘 I/O 操作)
二级索引(辅助索引)查询过程
当查询语句select * from product where product_no = '0002';由于字段product_no不是主键,需要先查询二级索引中的B+Tree索引值,获取主键值,通过该主键值,主键索引查询对应叶子节点获取数据。
回表:二级索引查询两个B+Tree过程。
索引覆盖:当查询数据能在二级索引的B+Tree叶子节点中查询到,比如:select id from product where product_no ='0002' # 直接查询主键id;
展开
评论
点赞
#青训营 x 字节后端训练营# 性能优化要依靠数据而不是猜测,用统一标准评估,服务优化要定位最大瓶颈而不是细枝末节,不要过早优化,因为产品在不断迭代优化,部分要求可能被更新,预期在即将出现性能问题后进行分析,不能过度优化,部分优化手段在修改需求后可能无法兼容。
性能分析工具pprof是能够可视化和简单性能分析的工具。基于github.com/wolfogre/go… 该项目埋入了炸弹代码,可以产生可观测的性能问题。性能分析主要针对CPU,堆内存,协程goroutine,锁Mutex,阻塞Block等方面进行展开。pprof提供可视化终端来分析代码性能。
六、空结构体
空结构体struct{}实例不占据任何内存空间,可以作为占位符使用,能够节省资源而且具有很强的语义。例如只需要用map代替实现set,值设置为空结构体能够有效节省内存。
七、atomic包
一般锁的实现是通过操作系统调用来实现,而atomic操作是通过硬件实现,效率比锁搞,sync.Mutex应该用来保护一段逻辑而不是仅仅用于保护一个变量,对于非数值操作可以用atomic.Value来承载interface{}。
小结:避免常见性能陷阱可以保证大部分程序的性能,而且不要一味追求程序的性能,越高级的性能优化手段越容易出现问题。
性能分析工具pprof是能够可视化和简单性能分析的工具。基于github.com/wolfogre/go… 该项目埋入了炸弹代码,可以产生可观测的性能问题。性能分析主要针对CPU,堆内存,协程goroutine,锁Mutex,阻塞Block等方面进行展开。pprof提供可视化终端来分析代码性能。
六、空结构体
空结构体struct{}实例不占据任何内存空间,可以作为占位符使用,能够节省资源而且具有很强的语义。例如只需要用map代替实现set,值设置为空结构体能够有效节省内存。
七、atomic包
一般锁的实现是通过操作系统调用来实现,而atomic操作是通过硬件实现,效率比锁搞,sync.Mutex应该用来保护一段逻辑而不是仅仅用于保护一个变量,对于非数值操作可以用atomic.Value来承载interface{}。
小结:避免常见性能陷阱可以保证大部分程序的性能,而且不要一味追求程序的性能,越高级的性能优化手段越容易出现问题。
展开
评论
点赞
#青训营 x 字节后端训练营# Mock测试
首先一些软件往往会依赖数据库,Cache和本地文件等,而单元测试目标是幂等和稳定,幂等是指重复运行测试case结果和之前一样,稳定是指单元测试可以相互隔离,能在任何时间对任何函数进行测试。如果存在强依赖,会不符合稳定的原则,因此产生了Mock机制。
常用的开源Mock测试包是monkey。常用功能是Patch(target(原函数), replacement(打桩函数)),打桩即为用函数A替换函数B,内存函数地址替换成运行时函数地址,实现mock功能。以及unpatch()卸载桩。
以下代码中,ReadFirstLine()函数会依赖读取的本地log文件,而通过Mock来替换就不会依赖本地文件了Mock测试
首先一些软件往往会依赖数据库,Cache和本地文件等,而单元测试目标是幂等和稳定,幂等是指重复运行测试case结果和之前一样,稳定是指单元测试可以相互隔离,能在任何时间对任何函数进行测试。如果存在强依赖,会不符合稳定的原则,因此产生了Mock机制。
常用的开源Mock测试包是monkey。常用功能是Patch(target(原函数), replacement(打桩函数)),打桩即为用函数A替换函数B,内存函数地址替换成运行时函数地址,实现mock功能。以及unpatch()卸载桩。
以下代码中,ReadFirstLine()函数会依赖读取的本地log文件,而通过Mock来替换就不会依赖本地文件了
首先一些软件往往会依赖数据库,Cache和本地文件等,而单元测试目标是幂等和稳定,幂等是指重复运行测试case结果和之前一样,稳定是指单元测试可以相互隔离,能在任何时间对任何函数进行测试。如果存在强依赖,会不符合稳定的原则,因此产生了Mock机制。
常用的开源Mock测试包是monkey。常用功能是Patch(target(原函数), replacement(打桩函数)),打桩即为用函数A替换函数B,内存函数地址替换成运行时函数地址,实现mock功能。以及unpatch()卸载桩。
以下代码中,ReadFirstLine()函数会依赖读取的本地log文件,而通过Mock来替换就不会依赖本地文件了Mock测试
首先一些软件往往会依赖数据库,Cache和本地文件等,而单元测试目标是幂等和稳定,幂等是指重复运行测试case结果和之前一样,稳定是指单元测试可以相互隔离,能在任何时间对任何函数进行测试。如果存在强依赖,会不符合稳定的原则,因此产生了Mock机制。
常用的开源Mock测试包是monkey。常用功能是Patch(target(原函数), replacement(打桩函数)),打桩即为用函数A替换函数B,内存函数地址替换成运行时函数地址,实现mock功能。以及unpatch()卸载桩。
以下代码中,ReadFirstLine()函数会依赖读取的本地log文件,而通过Mock来替换就不会依赖本地文件了
展开
评论
点赞
#青训营 x 字节后端训练营# 切片的比较:
不能直接比较两个切片的内容是否相等,因为切片是引用类型,它们的底层数组可能不同,即使它们的元素相同。先比较它们的长度,如果长度不相等,则它们不相等;如果长度相等,则可以使用循环遍历来比较每个元素。
可以使用 reflect.DeepEqual 函数来比较两个切片是否相等,但要注意,该函数是一个通用的深度相等性测试,会比较两个值的类型和结构,并且可能会在某些情况下出现误判。因此,除非必要,否则不建议使用该函数进行切片比较。
切片类型和数组类型的比较可以通过循环遍历比较每个元素的方式实现,但是需要注意两者长度和元素值的一一对应关系。
切片类型和 nil 的比较可以使用 len() 函数,如果切片长度为 0,则说明切片是 nil。
不能直接比较两个切片的内容是否相等,因为切片是引用类型,它们的底层数组可能不同,即使它们的元素相同。先比较它们的长度,如果长度不相等,则它们不相等;如果长度相等,则可以使用循环遍历来比较每个元素。
可以使用 reflect.DeepEqual 函数来比较两个切片是否相等,但要注意,该函数是一个通用的深度相等性测试,会比较两个值的类型和结构,并且可能会在某些情况下出现误判。因此,除非必要,否则不建议使用该函数进行切片比较。
切片类型和数组类型的比较可以通过循环遍历比较每个元素的方式实现,但是需要注意两者长度和元素值的一一对应关系。
切片类型和 nil 的比较可以使用 len() 函数,如果切片长度为 0,则说明切片是 nil。
展开
评论
点赞
#青训营 x 字节后端训练营# go语言中直接传入函数名称:函数也是一种类型,可以作为变量的值,动态绑定请求处理函数。
go mod init创建一个新模块,初始化描述它的go.mod文件。
go build、go test和其他包构建命令根据需要向go.mod添加新的依赖项。
go list-m all列出当前模块及其所有依赖项
go get更改依赖项的所需版本(或添加新的依赖项)。
go mod tidy 删除未使用的依赖项。 go语言中直接传入函数名称:函数也是一种类型,可以作为变量的值,动态绑定请求处理函数。
go mod init创建一个新模块,初始化描述它的go.mod文件。
go build、go test和其他包构建命令根据需要向go.mod添加新的依赖项。
go list-m all列出当前模块及其所有依赖项
go get更改依赖项的所需版本(或添加新的依赖项)。
go mod tidy 删除未使用的依赖项。
go mod init创建一个新模块,初始化描述它的go.mod文件。
go build、go test和其他包构建命令根据需要向go.mod添加新的依赖项。
go list-m all列出当前模块及其所有依赖项
go get更改依赖项的所需版本(或添加新的依赖项)。
go mod tidy 删除未使用的依赖项。 go语言中直接传入函数名称:函数也是一种类型,可以作为变量的值,动态绑定请求处理函数。
go mod init创建一个新模块,初始化描述它的go.mod文件。
go build、go test和其他包构建命令根据需要向go.mod添加新的依赖项。
go list-m all列出当前模块及其所有依赖项
go get更改依赖项的所需版本(或添加新的依赖项)。
go mod tidy 删除未使用的依赖项。
展开
评论
点赞
#青训营 x 字节后端训练营# 切片的比较:
不能直接比较两个切片的内容是否相等,因为切片是引用类型,它们的底层数组可能不同,即使它们的元素相同。先比较它们的长度,如果长度不相等,则它们不相等;如果长度相等,则可以使用循环遍历来比较每个元素。
可以使用 reflect.DeepEqual 函数来比较两个切片是否相等,但要注意,该函数是一个通用的深度相等性测试,会比较两个值的类型和结构,并且可能会在某些情况下出现误判。因此,除非必要,否则不建议使用该函数进行切片比较。
切片类型和数组类型的比较可以通过循环遍历比较每个元素的方式实现,但是需要注意两者长度和元素值的一一对应关系。
切片类型和 nil 的比较可以使用 len() 函数,如果切片长度为 0,则说明切片是 nil。
不能直接比较两个切片的内容是否相等,因为切片是引用类型,它们的底层数组可能不同,即使它们的元素相同。先比较它们的长度,如果长度不相等,则它们不相等;如果长度相等,则可以使用循环遍历来比较每个元素。
可以使用 reflect.DeepEqual 函数来比较两个切片是否相等,但要注意,该函数是一个通用的深度相等性测试,会比较两个值的类型和结构,并且可能会在某些情况下出现误判。因此,除非必要,否则不建议使用该函数进行切片比较。
切片类型和数组类型的比较可以通过循环遍历比较每个元素的方式实现,但是需要注意两者长度和元素值的一一对应关系。
切片类型和 nil 的比较可以使用 len() 函数,如果切片长度为 0,则说明切片是 nil。
展开
评论
点赞