From 57cda30d14302abd52fa60ce677447ef9adbbc18 Mon Sep 17 00:00:00 2001 From: lihaibineric Date: Wed, 6 Dec 2023 09:41:41 +0800 Subject: [PATCH] Site updated: 2023-12-06 09:41:41 --- 2023/11/25/linux/index.html | 27 ++- .../go-\345\237\272\347\241\200/index.html" | 177 +++++++++++++++- local-search.xml | 4 +- search.xml | 192 +++++++++++++++++- 4 files changed, 384 insertions(+), 16 deletions(-) diff --git a/2023/11/25/linux/index.html b/2023/11/25/linux/index.html index b055bfa..73cecfc 100644 --- a/2023/11/25/linux/index.html +++ b/2023/11/25/linux/index.html @@ -24,7 +24,7 @@ - + @@ -209,7 +209,7 @@ - 2.1k words + 2.4k words @@ -220,7 +220,7 @@ - 18 mins + 20 mins @@ -492,10 +492,24 @@

Linux中查看系统使用情况

-

查看GPU:nvidia-smi

+

查看系统的GPU

实时查看GPU使用情况

1
watch -n 1 nvidia-smi 

行代码的意思是只选择指定标号GPU进行使用,执行完该行代码之后python环境无法检测到指定GPU之外的其他

+

系统环境变量

+

对于MACOS,用VIM进入

+
1
vim ~/.zshrc
+

添加环境变量的语句是,这里以增加路径为例子

+
1
export GOPATH="user/workspace/golang"
+

添加完环境变量之后,激活一下设置

+
1
source ~/.zshrc
+

同样对于Linux系统而言也是相同的步骤

+
1
vim ~/.bashrc
+

添加完成之后最后激活一下设定

+
1
source ~/.bashrc
+

如果想直接查看当前某个环境变量的设置的值可以用以下的命令进行查看

+
1
echo $GOPARH
+

输出的值是当前的这个环境变量设置的值,比如会输出:user/workspace/golang

显示Linux系统的其他信息

时间和日期
@@ -570,12 +584,11 @@
进程信息
-

ping检测当前服务器的网络是否通畅

+

网络测试

​ ping 一般用于检测当前计算机到目标计算机之间的网络 是否通畅,数值越大,速度越慢

1
2
3
4
# 检测到目标主机是否连接正常
$ ping IP地址 www.baidu.com
# 检测本地网卡工作正常
$ ping 127.0.0.1
-

指定代码在哪个GPU上跑

+

GPU运行指定

  1. 首先先查看对应的GPU内存:nvidia-smi

  2. 然后在终端输出代码:

    diff --git "a/2023/11/27/go-\345\237\272\347\241\200/index.html" "b/2023/11/27/go-\345\237\272\347\241\200/index.html" index f06dcb6..f2448a4 100644 --- "a/2023/11/27/go-\345\237\272\347\241\200/index.html" +++ "b/2023/11/27/go-\345\237\272\347\241\200/index.html" @@ -26,7 +26,7 @@ - + @@ -211,7 +211,7 @@ @@ -222,7 +222,7 @@ - 3 mins + 31 mins @@ -285,12 +285,183 @@

    安装步骤:

go语言没有异常,全部都用ERROR来表示

+

GOROOT 表示的是安装包所在的位置,一般不需要修改

+

GOPATH表示的是运行文件所在的位置,表示的是workspace的文件位置,里面新建三个文件夹:bin +pkg src,src一般用来表示工程文件所在的位置

+

修改GOPATH的路径

+
1
export GOPATH="/Users/lihaibin/workspace/golang"
+

将文件查找的路径设置为GOROOT和GOPATH的并集合

+
1
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
+

注意这个地方不能将gomod设置为on,否则有问题

+

将两个部分并在一起之后,就能从两个地方开始寻找定义的包

+
+ + +
+

首先会从GOROOT进行搜索,接着从GOPATH进行搜索

+
+ + +

Go基本语法

如何编译并运行一个Go文件

对于已经写好的go文件,这里以hello.go作为例子,直接使用以下语句进行编译并运行

1
go run hello.go

或者将编译和运行两个过程分开,先编译后运行:

1
2
go build hello.go
./ hello
+

hello.go

+

首先给出基本框架

+
1
2
3
4
5
6
7
8
9
10
11
package main

import(
"fmt",
"time"
)

func main(){
fmt.Println("hello world!")
time.Sleep(1*time.Second)
}
+

程序的第一行声明了名为main的package。一个package会包含一个或多个.go源代码文件。每一个源文件都是以package开头。比如我们的例子里是package +main。这行声明语句表示该文件是属于哪一个package。

+

同时需要注意,一个程序的main入口函数必须不带任何输入参数和返回结果

+

参数

+

函数

+

多个返回值初始化设置了函数的形参之后,初始值是0

+

go每次设置一个变量值之后都有初始值,如果是数据就是0,如果是字符串那么就是空,防止出现一些野指针的情况

+

import和init

+
+ + +
+

分别建不同的文件夹对应的就是package的名字,相应的在.go文件内部声明package的名字

+

注意: +在包中设置接口的时候,函数名称必须第一个字母是大写,如果是小写的话将无法识别

+

如果函数名第一个是大写就是对外开放的函数,认为是public

+

如果函数名第一个是小写的话就认为是私有的函数,认为是private

+
+ + +
+

init函数的调用过程,首先会对包中的init进行初始化再进行调用接口

+
+ + +
+

如果你导入了包比如lib1,但是没有使用这个包里面的接口函数,仍然会报错

+
+ + +
+

但是如果我不想调用lib1的函数接口,但是想使用lib1的init()函数怎么办呢,如果这个时候直接导入了包 +但是不调用接口,就会出现上述的错误

+

匿名导包方式

+

在导入的包前面加上下划线来认为这个包是匿名的,这样就能知进行init操作

+
+ + +
+
+ + +
+

给新导入的包起个别的名字,比如叫mylib作为新的别名

+
+ + +
+

或者直接使用·来进行调用

+
+ + +
+

最好别使用这种,如果两个包的函数名称一样那么可能会导致出现歧义的情况

+

GO指针

+

和C++以及C中的是一样的

+

定义的时候 *int 传递变量的地址&

+
+ + +
+

+

数组与切片

+

通过这种方式进行初始化数组以及进行切片操作,通过range关键字进行遍历数组,并给出index和value进行给出不同的下标和数值

+
+ + +
+

固定数组传递的是一个值拷贝

+

动态数组 slice

+

但是动态数组或者是说切片是一个引用传递

+

同时动态数组传递的过程中的参数形式是一致的,能够适配所有的slice参数类型,但是对于

+
+ + +
+
+ + +
+

这里面的下划线表示的是不需要考虑的index的数值,可以忽略

+

这里是关于切片slice的声明和打印

+
1
2
3
4
5
	//声明切片之后的长度是3,同时初始化的值是1,2,3
slice1 :=[]int{1,2,3}
//%v表示的是打印出全部的表示信息
fmt.Printf("len = %d, slice =%v\n", len(slice1),slice1)
}
+

打印的结果是

+
+ + +
+

声明slice但是不一定声明了空间,因此需要注意的是声明的同时并给出空间大小,同时没办法中途增加空间

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package main

import (
"fmt"
)

func main(){
/*
声明切片之后的长度是3,同时初始化的值是1,2,3
*/
slice1 :=[]int{1,2,3}
//%v表示的是打印出全部的表示信息
fmt.Printf("len = %d, slice =%v\n", len(slice1),slice1)
//直接对没有赋予空间的位置修改会出现位置越界
//slice1[3]=999
slice1 = make([]int,4)
//但是这个时候就只会重新赋予空间并复制0
fmt.Printf("len = %d, slice =%v\n", len(slice1),slice1)


/*
声明slice是切片,但是没有分配空间
*/
var slice2 []int
fmt.Printf("len = %d, slice =%v\n", len(slice2),slice2)

//slice2[0]=2 //直接赋予数值会出现错误,越界
slice2 = make([]int,3)
//开辟空间,但是默认值都是0
fmt.Printf("len = %d, slice =%v\n", len(slice2),slice2)
slice2[0]=1000
fmt.Printf("len = %d, slice =%v\n", len(slice2),slice2)
//此时就修改成功

/*
声明slice类型,同时分配空间
*/
var slice3 =make([]int,5)
fmt.Printf("len = %d, slice =%v\n", len(slice3),slice3)


/*
判断一个slice切片是不是为0
*/
if slice1 == nil{
fmt.Println("slice1 is null")
}else{
fmt.Println("slice1 is not null")
}
}
+

注意if else的格式有要求

+
+ + +
+
+ + +
+
+ + +
+

关于切片的截取操作

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 
切片的截取
*/
var slice6 = make([]int,3)
slice6[0]=1
slice6[2]=33
fmt.Printf("len = %d, cap = %d, slice =%v\n", len(slice6), cap(slice6), slice6)
//截取的过程中是左闭右开
s1:=slice6[0:2]
// s1:=slice6[:]//表示截取全部
fmt.Println(s1)
//注意此时的s1的地址和slice6的位置一样了

//copy
var s2 = make([]int,3)
copy(s2,slice6)
fmt.Println(s2)// 只会从头开始截取s2长度的,如果长了那么就是0,
//否则就是选择slice6中相同长度的元素,从左到右边
+

map的操作

+

反射

+

变量结构

+
+ + +
diff --git a/local-search.xml b/local-search.xml index cb67cf4..5565c39 100644 --- a/local-search.xml +++ b/local-search.xml @@ -8,7 +8,7 @@ /2023/11/27/go-%E5%9F%BA%E7%A1%80/ -

学习网站:8小时转职Golang工程师

Go的环境安装

下载官网:

go的官网下载网站,选择合适的系统版本进行安装https://go.dev/dl/

安装步骤:

  1. 下载安装包并按照安装包的指引下载相关的内容

  2. 对于Mac系统会直接配置好环境变量,根据官网的安装手册进行安装 https://go.dev/doc/install

  3. 测试GO的版本

    1
    go version

    go version

  4. 测试GO的环境变量

    1
    go env

    go env

go语言没有异常,全部都用ERROR来表示

Go基本语法

如何编译并运行一个Go文件

对于已经写好的go文件,这里以hello.go作为例子,直接使用以下语句进行编译并运行

1
go run hello.go

或者将编译和运行两个过程分开,先编译后运行:

1
2
go build hello.go
./ hello
]]>
+

学习网站:8小时转职Golang工程师

Go的环境安装

下载官网:

go的官网下载网站,选择合适的系统版本进行安装https://go.dev/dl/

安装步骤:

  1. 下载安装包并按照安装包的指引下载相关的内容

  2. 对于Mac系统会直接配置好环境变量,根据官网的安装手册进行安装 https://go.dev/doc/install

  3. 测试GO的版本

    1
    go version

    go version

  4. 测试GO的环境变量

    1
    go env

    go env

go语言没有异常,全部都用ERROR来表示

GOROOT 表示的是安装包所在的位置,一般不需要修改

GOPATH表示的是运行文件所在的位置,表示的是workspace的文件位置,里面新建三个文件夹:binpkg src,src一般用来表示工程文件所在的位置

修改GOPATH的路径

1
export GOPATH="/Users/lihaibin/workspace/golang"

将文件查找的路径设置为GOROOT和GOPATH的并集合

1
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

注意这个地方不能将gomod设置为on,否则有问题

将两个部分并在一起之后,就能从两个地方开始寻找定义的包

首先会从GOROOT进行搜索,接着从GOPATH进行搜索

Go基本语法

如何编译并运行一个Go文件

对于已经写好的go文件,这里以hello.go作为例子,直接使用以下语句进行编译并运行

1
go run hello.go

或者将编译和运行两个过程分开,先编译后运行:

1
2
go build hello.go
./ hello

hello.go

首先给出基本框架

1
2
3
4
5
6
7
8
9
10
11
package main

import(
"fmt",
"time"
)

func main(){
fmt.Println("hello world!")
time.Sleep(1*time.Second)
}

程序的第一行声明了名为main的package。一个package会包含一个或多个.go源代码文件。每一个源文件都是以package开头。比如我们的例子里是packagemain。这行声明语句表示该文件是属于哪一个package。

同时需要注意,一个程序的main入口函数必须不带任何输入参数和返回结果

参数

函数

多个返回值初始化设置了函数的形参之后,初始值是0

go每次设置一个变量值之后都有初始值,如果是数据就是0,如果是字符串那么就是空,防止出现一些野指针的情况

import和init

分别建不同的文件夹对应的就是package的名字,相应的在.go文件内部声明package的名字

注意:在包中设置接口的时候,函数名称必须第一个字母是大写,如果是小写的话将无法识别

如果函数名第一个是大写就是对外开放的函数,认为是public

如果函数名第一个是小写的话就认为是私有的函数,认为是private

init函数的调用过程,首先会对包中的init进行初始化再进行调用接口

如果你导入了包比如lib1,但是没有使用这个包里面的接口函数,仍然会报错

但是如果我不想调用lib1的函数接口,但是想使用lib1的init()函数怎么办呢,如果这个时候直接导入了包但是不调用接口,就会出现上述的错误

匿名导包方式

在导入的包前面加上下划线来认为这个包是匿名的,这样就能知进行init操作

给新导入的包起个别的名字,比如叫mylib作为新的别名

或者直接使用·来进行调用

最好别使用这种,如果两个包的函数名称一样那么可能会导致出现歧义的情况

GO指针

和C++以及C中的是一样的

定义的时候 *int 传递变量的地址&

数组与切片

通过这种方式进行初始化数组以及进行切片操作,通过range关键字进行遍历数组,并给出index和value进行给出不同的下标和数值

固定数组传递的是一个值拷贝

动态数组 slice

但是动态数组或者是说切片是一个引用传递

同时动态数组传递的过程中的参数形式是一致的,能够适配所有的slice参数类型,但是对于

这里面的下划线表示的是不需要考虑的index的数值,可以忽略

这里是关于切片slice的声明和打印

1
2
3
4
5
//声明切片之后的长度是3,同时初始化的值是1,2,3
slice1 :=[]int{1,2,3}
//%v表示的是打印出全部的表示信息
fmt.Printf("len = %d, slice =%v\n", len(slice1),slice1)
}

打印的结果是

声明slice但是不一定声明了空间,因此需要注意的是声明的同时并给出空间大小,同时没办法中途增加空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package main

import (
"fmt"
)

func main(){
/*
声明切片之后的长度是3,同时初始化的值是1,2,3
*/
slice1 :=[]int{1,2,3}
//%v表示的是打印出全部的表示信息
fmt.Printf("len = %d, slice =%v\n", len(slice1),slice1)
//直接对没有赋予空间的位置修改会出现位置越界
//slice1[3]=999
slice1 = make([]int,4)
//但是这个时候就只会重新赋予空间并复制0
fmt.Printf("len = %d, slice =%v\n", len(slice1),slice1)


/*
声明slice是切片,但是没有分配空间
*/
var slice2 []int
fmt.Printf("len = %d, slice =%v\n", len(slice2),slice2)

//slice2[0]=2 //直接赋予数值会出现错误,越界
slice2 = make([]int,3)
//开辟空间,但是默认值都是0
fmt.Printf("len = %d, slice =%v\n", len(slice2),slice2)
slice2[0]=1000
fmt.Printf("len = %d, slice =%v\n", len(slice2),slice2)
//此时就修改成功

/*
声明slice类型,同时分配空间
*/
var slice3 =make([]int,5)
fmt.Printf("len = %d, slice =%v\n", len(slice3),slice3)


/*
判断一个slice切片是不是为0
*/
if slice1 == nil{
fmt.Println("slice1 is null")
}else{
fmt.Println("slice1 is not null")
}
}

注意if else的格式有要求

关于切片的截取操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 
切片的截取
*/
var slice6 = make([]int,3)
slice6[0]=1
slice6[2]=33
fmt.Printf("len = %d, cap = %d, slice =%v\n", len(slice6), cap(slice6), slice6)
//截取的过程中是左闭右开
s1:=slice6[0:2]
// s1:=slice6[:]//表示截取全部
fmt.Println(s1)
//注意此时的s1的地址和slice6的位置一样了

//copy
var s2 = make([]int,3)
copy(s2,slice6)
fmt.Println(s2)// 只会从头开始截取s2长度的,如果长了那么就是0,
//否则就是选择slice6中相同长度的元素,从左到右边

map的操作

反射

变量结构

]]>
@@ -33,7 +33,7 @@ /2023/11/25/linux/ - Linux命令集

查看当前路径的位置 pwd

查看命令历史

终端中输入

1
history

当前目录下的文件

  • 当前目录下的文件 ls
  • ls -l;ls-h;都是用来显示文件的详细信息
  • ls -a 来显示所有的文件(包含隐藏文件)
  • 组合使用 ls -lha 显示所有并包含的隐藏文件且显示详细信息
  • 使用dir显示当前文件夹下的文件名*

切换文件夹

  • cd .. #返回父级目录

  • cd切换到当前用户的主目录(/home/用户目录)
    cd ~切换到当前用户的主目录(/home/用户目录)
    cd .保持在当前目录不变
    cd …切换到上级目录
    cd -可以在最近两次工作目录之间来回切换
  • 相对路径 在输入路径时,最前面不是 / 或者 ~,表示相对 当前目录所在的目录位置 绝对路径 在输入路径时,最前面是 / 或者 ~,表示从根目录/家目录 开始的具体目录位置

移动文件到指定位置 mv

  • mv 文件名 指定的路径位置 -i 用于提示

  • 修改文件夹名称:mv 原来的文件夹名称 后来的文件夹名称

  • 拷贝某个文件夹到指定路径
    • cp 当前文件夹下某个文件名(带后缀) 目标路径 -i用于提示

      命令对应英文作用
      01tree [目录名]tree以树状图列出文件目录结构
      02cp 源文件目标文件copy复制文件或者目录
      03mv 源文件 目标文件move移动文件或者目录/文件或者目录重命名

创建文件夹

  • 进入路径的位置 mkdir 需要创建的文件夹的名称
  • 递归创建文件夹 mkdir -p 123/456在123文件夹下递归创建文件夹456

新建某个文件

1
touch 123.txt

删除文件夹

  • rmdir+ 需要删除的文件名

删除某个文件

  • 使用rm来对文件进行删除 -i 进行删除前的查询

  • 选项含义
    -f强制删除,忽略不存在的文件,无需提示
    -r递归地删除目录下的内容,删除文件夹时必须加此参数

解压缩文件的指令

  • 对于ZIP文件的操作
    • 解压操作:进入需要解压的文件的位置:unzipfilename.zip
    • 压缩文件:同理进入需要解压的文件夹的上一级 zip filename.zip

Linux中查看系统使用情况

  • Top 来显示CPU的占用情况:

    PID进程的IDUSER进程所有者
    PR进程的优先级别,越小越优先被执行NInice
    VIRT进程占用的虚拟内存RES进程占用的物理内存
    SHR进程使用的共享内存S进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
    %CPU进程占用CPU的使用率%MEM进程使用的物理内存和总内存的百分比
    TIME+该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值COMMAND进程启动命令名称
  • top退出方式是==用q进行退出==

  • free查看内存的使用情况

    total总计物理内存的大小used已使用多大
    free可用有多少Shared多个进程共享的内存总额
    Buffers/cached磁盘缓存的大小
  • vmstat指令也是用于查看内存的使用

    • Procs(进程): r:运行队列中进程数量,这个值也可以判断是否需要增加CPU。(长期大于1) b:等待IO的进程数量

    • Memory(内存):swpd: 使用虚拟内存大小;free:空闲物理内存大小;buff: 用作缓冲的内存大小;cache:用作缓存的内存大小

    • Swap: si:每秒从交换区写到内存的大小,由磁盘调入内存;so:每秒写入交换区的内存大小,由内存调入磁盘

    • IO:bi: 每秒读取的块数,bo:每秒写入的块数

    • 系统: in: 每秒中断数,包括时钟中断。 cs:每秒上下文切换数。

    • CPU(以百分比表示):us:用户进程执行时间百分比(user time) sy: 内核系统进程执行时间百分比(systemtime) ;wa: IO等待时间百分比; id: 空闲时间百分比

查看GPU:nvidia-smi

实时查看GPU使用情况

1
watch -n 1 nvidia-smi 

行代码的意思是只选择指定标号GPU进行使用,执行完该行代码之后python环境无法检测到指定GPU之外的其他

显示Linux系统的其他信息

时间和日期
序号命令作用
01date查看系统时间
02calcalendar 查看日历, -y 选项可以查看一年的日历
磁盘信息
序号命令作用
01df -hdisk free 显示磁盘剩余空间
02du -h [目录名]disk usage 显示目录下的文件大小
进程信息

​ 所谓进程,通俗地说就是当前正在执行的一个程序

序号命令作用
01ps auxprocess status 查看进程的详细状况
02top动态显示运行中的进程并且排序
03kill [-9] 进程代号终止指定代号的进程, -9 表示强行终止
ping检测当前服务器的网络是否通畅

​ ping 一般用于检测当前计算机到目标计算机之间的网络是否通畅,数值越大,速度越慢

1
2
3
4
# 检测到目标主机是否连接正常
$ ping IP地址 www.baidu.com
# 检测本地网卡工作正常
$ ping 127.0.0.1

指定代码在哪个GPU上跑

  1. 首先先查看对应的GPU内存:nvidia-smi

  2. 然后在终端输出代码:

    1
    CUDA_VISIBLE_DEVICES=1 python your_model.py 

    再或者使用**torch.cuda.set_device()**函数指定gpu使用编号:

    1
    2
    import torch
    torch.cuda.set_device(2) # 使用2号GPU
]]>
+ Linux命令集

查看当前路径的位置 pwd

查看命令历史

终端中输入

1
history

当前目录下的文件

  • 当前目录下的文件 ls
  • ls -l;ls-h;都是用来显示文件的详细信息
  • ls -a 来显示所有的文件(包含隐藏文件)
  • 组合使用 ls -lha 显示所有并包含的隐藏文件且显示详细信息
  • 使用dir显示当前文件夹下的文件名*

切换文件夹

  • cd .. #返回父级目录

  • cd切换到当前用户的主目录(/home/用户目录)
    cd ~切换到当前用户的主目录(/home/用户目录)
    cd .保持在当前目录不变
    cd …切换到上级目录
    cd -可以在最近两次工作目录之间来回切换
  • 相对路径 在输入路径时,最前面不是 / 或者 ~,表示相对 当前目录所在的目录位置 绝对路径 在输入路径时,最前面是 / 或者 ~,表示从根目录/家目录 开始的具体目录位置

移动文件到指定位置 mv

  • mv 文件名 指定的路径位置 -i 用于提示

  • 修改文件夹名称:mv 原来的文件夹名称 后来的文件夹名称

  • 拷贝某个文件夹到指定路径
    • cp 当前文件夹下某个文件名(带后缀) 目标路径 -i用于提示

      命令对应英文作用
      01tree [目录名]tree以树状图列出文件目录结构
      02cp 源文件目标文件copy复制文件或者目录
      03mv 源文件 目标文件move移动文件或者目录/文件或者目录重命名

创建文件夹

  • 进入路径的位置 mkdir 需要创建的文件夹的名称
  • 递归创建文件夹 mkdir -p 123/456在123文件夹下递归创建文件夹456

新建某个文件

1
touch 123.txt

删除文件夹

  • rmdir+ 需要删除的文件名

删除某个文件

  • 使用rm来对文件进行删除 -i 进行删除前的查询

  • 选项含义
    -f强制删除,忽略不存在的文件,无需提示
    -r递归地删除目录下的内容,删除文件夹时必须加此参数

解压缩文件的指令

  • 对于ZIP文件的操作
    • 解压操作:进入需要解压的文件的位置:unzipfilename.zip
    • 压缩文件:同理进入需要解压的文件夹的上一级 zip filename.zip

Linux中查看系统使用情况

  • Top 来显示CPU的占用情况:

    PID进程的IDUSER进程所有者
    PR进程的优先级别,越小越优先被执行NInice
    VIRT进程占用的虚拟内存RES进程占用的物理内存
    SHR进程使用的共享内存S进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
    %CPU进程占用CPU的使用率%MEM进程使用的物理内存和总内存的百分比
    TIME+该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值COMMAND进程启动命令名称
  • top退出方式是==用q进行退出==

  • free查看内存的使用情况

    total总计物理内存的大小used已使用多大
    free可用有多少Shared多个进程共享的内存总额
    Buffers/cached磁盘缓存的大小
  • vmstat指令也是用于查看内存的使用

    • Procs(进程): r:运行队列中进程数量,这个值也可以判断是否需要增加CPU。(长期大于1) b:等待IO的进程数量

    • Memory(内存):swpd: 使用虚拟内存大小;free:空闲物理内存大小;buff: 用作缓冲的内存大小;cache:用作缓存的内存大小

    • Swap: si:每秒从交换区写到内存的大小,由磁盘调入内存;so:每秒写入交换区的内存大小,由内存调入磁盘

    • IO:bi: 每秒读取的块数,bo:每秒写入的块数

    • 系统: in: 每秒中断数,包括时钟中断。 cs:每秒上下文切换数。

    • CPU(以百分比表示):us:用户进程执行时间百分比(user time) sy: 内核系统进程执行时间百分比(systemtime) ;wa: IO等待时间百分比; id: 空闲时间百分比

查看系统的GPU

实时查看GPU使用情况

1
watch -n 1 nvidia-smi 

行代码的意思是只选择指定标号GPU进行使用,执行完该行代码之后python环境无法检测到指定GPU之外的其他

系统环境变量

对于MACOS,用VIM进入

1
vim ~/.zshrc

添加环境变量的语句是,这里以增加路径为例子

1
export GOPATH="user/workspace/golang"

添加完环境变量之后,激活一下设置

1
source ~/.zshrc

同样对于Linux系统而言也是相同的步骤

1
vim ~/.bashrc

添加完成之后最后激活一下设定

1
source ~/.bashrc

如果想直接查看当前某个环境变量的设置的值可以用以下的命令进行查看

1
echo $GOPARH

输出的值是当前的这个环境变量设置的值,比如会输出:user/workspace/golang

显示Linux系统的其他信息

时间和日期
序号命令作用
01date查看系统时间
02calcalendar 查看日历, -y 选项可以查看一年的日历
磁盘信息
序号命令作用
01df -hdisk free 显示磁盘剩余空间
02du -h [目录名]disk usage 显示目录下的文件大小
进程信息

​ 所谓进程,通俗地说就是当前正在执行的一个程序

序号命令作用
01ps auxprocess status 查看进程的详细状况
02top动态显示运行中的进程并且排序
03kill [-9] 进程代号终止指定代号的进程, -9 表示强行终止

网络测试

​ ping 一般用于检测当前计算机到目标计算机之间的网络是否通畅,数值越大,速度越慢

1
2
3
4
# 检测到目标主机是否连接正常
$ ping IP地址 www.baidu.com
# 检测本地网卡工作正常
$ ping 127.0.0.1

GPU运行指定

  1. 首先先查看对应的GPU内存:nvidia-smi

  2. 然后在终端输出代码:

    1
    CUDA_VISIBLE_DEVICES=1 python your_model.py 

    再或者使用**torch.cuda.set_device()**函数指定gpu使用编号:

    1
    2
    import torch
    torch.cuda.set_device(2) # 使用2号GPU
]]>
diff --git a/search.xml b/search.xml index 3a412d4..d9a5eb4 100644 --- a/search.xml +++ b/search.xml @@ -1299,10 +1299,24 @@ time) ;wa: IO等待时间百分比; id: 空闲时间百分比

-

查看GPU:nvidia-smi

+

查看系统的GPU

实时查看GPU使用情况

watch -n 1 nvidia-smi 

行代码的意思是只选择指定标号GPU进行使用,执行完该行代码之后python环境无法检测到指定GPU之外的其他

+

系统环境变量

+

对于MACOS,用VIM进入

+
vim ~/.zshrc
+

添加环境变量的语句是,这里以增加路径为例子

+
export GOPATH="user/workspace/golang"
+

添加完环境变量之后,激活一下设置

+
source ~/.zshrc
+

同样对于Linux系统而言也是相同的步骤

+
vim ~/.bashrc
+

添加完成之后最后激活一下设定

+
source ~/.bashrc
+

如果想直接查看当前某个环境变量的设置的值可以用以下的命令进行查看

+
echo $GOPARH
+

输出的值是当前的这个环境变量设置的值,比如会输出:user/workspace/golang

显示Linux系统的其他信息

时间和日期
@@ -1377,12 +1391,11 @@ time) ;wa: IO等待时间百分比; id: 空闲时间百分比

-

ping检测当前服务器的网络是否通畅

+

网络测试

​ ping 一般用于检测当前计算机到目标计算机之间的网络 是否通畅,数值越大,速度越慢

# 检测到目标主机是否连接正常
$ ping IP地址 www.baidu.com
# 检测本地网卡工作正常
$ ping 127.0.0.1
-

指定代码在哪个GPU上跑

+

GPU运行指定

  1. 首先先查看对应的GPU内存:nvidia-smi

  2. 然后在终端输出代码:

    @@ -1424,12 +1437,183 @@ href="https://go.dev/doc/install">https://go.dev/doc/install

go语言没有异常,全部都用ERROR来表示

+

GOROOT 表示的是安装包所在的位置,一般不需要修改

+

GOPATH表示的是运行文件所在的位置,表示的是workspace的文件位置,里面新建三个文件夹:bin +pkg src,src一般用来表示工程文件所在的位置

+

修改GOPATH的路径

+
export GOPATH="/Users/lihaibin/workspace/golang"
+

将文件查找的路径设置为GOROOT和GOPATH的并集合

+
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
+

注意这个地方不能将gomod设置为on,否则有问题

+

将两个部分并在一起之后,就能从两个地方开始寻找定义的包

+
+ + +
+

首先会从GOROOT进行搜索,接着从GOPATH进行搜索

+
+ + +

Go基本语法

如何编译并运行一个Go文件

对于已经写好的go文件,这里以hello.go作为例子,直接使用以下语句进行编译并运行

go run hello.go

或者将编译和运行两个过程分开,先编译后运行:

go build hello.go
./ hello
+

hello.go

+

首先给出基本框架

+
package main

import(
"fmt",
"time"
)

func main(){
fmt.Println("hello world!")
time.Sleep(1*time.Second)
}
+

程序的第一行声明了名为main的package。一个package会包含一个或多个.go源代码文件。每一个源文件都是以package开头。比如我们的例子里是package +main。这行声明语句表示该文件是属于哪一个package。

+

同时需要注意,一个程序的main入口函数必须不带任何输入参数和返回结果

+

参数

+

函数

+

多个返回值初始化设置了函数的形参之后,初始值是0

+

go每次设置一个变量值之后都有初始值,如果是数据就是0,如果是字符串那么就是空,防止出现一些野指针的情况

+

import和init

+
+ + +
+

分别建不同的文件夹对应的就是package的名字,相应的在.go文件内部声明package的名字

+

注意: +在包中设置接口的时候,函数名称必须第一个字母是大写,如果是小写的话将无法识别

+

如果函数名第一个是大写就是对外开放的函数,认为是public

+

如果函数名第一个是小写的话就认为是私有的函数,认为是private

+
+ + +
+

init函数的调用过程,首先会对包中的init进行初始化再进行调用接口

+
+ + +
+

如果你导入了包比如lib1,但是没有使用这个包里面的接口函数,仍然会报错

+
+ + +
+

但是如果我不想调用lib1的函数接口,但是想使用lib1的init()函数怎么办呢,如果这个时候直接导入了包 +但是不调用接口,就会出现上述的错误

+

匿名导包方式

+

在导入的包前面加上下划线来认为这个包是匿名的,这样就能知进行init操作

+
+ + +
+
+ + +
+

给新导入的包起个别的名字,比如叫mylib作为新的别名

+
+ + +
+

或者直接使用·来进行调用

+
+ + +
+

最好别使用这种,如果两个包的函数名称一样那么可能会导致出现歧义的情况

+

GO指针

+

和C++以及C中的是一样的

+

定义的时候 *int 传递变量的地址&

+
+ + +
+

+

数组与切片

+

通过这种方式进行初始化数组以及进行切片操作,通过range关键字进行遍历数组,并给出index和value进行给出不同的下标和数值

+
+ + +
+

固定数组传递的是一个值拷贝

+

动态数组 slice

+

但是动态数组或者是说切片是一个引用传递

+

同时动态数组传递的过程中的参数形式是一致的,能够适配所有的slice参数类型,但是对于

+
+ + +
+
+ + +
+

这里面的下划线表示的是不需要考虑的index的数值,可以忽略

+

这里是关于切片slice的声明和打印

+
	//声明切片之后的长度是3,同时初始化的值是1,2,3
slice1 :=[]int{1,2,3}
//%v表示的是打印出全部的表示信息
fmt.Printf("len = %d, slice =%v\n", len(slice1),slice1)
}
+

打印的结果是

+
+ + +
+

声明slice但是不一定声明了空间,因此需要注意的是声明的同时并给出空间大小,同时没办法中途增加空间

+
package main

import (
"fmt"
)

func main(){
/*
声明切片之后的长度是3,同时初始化的值是1,2,3
*/
slice1 :=[]int{1,2,3}
//%v表示的是打印出全部的表示信息
fmt.Printf("len = %d, slice =%v\n", len(slice1),slice1)
//直接对没有赋予空间的位置修改会出现位置越界
//slice1[3]=999
slice1 = make([]int,4)
//但是这个时候就只会重新赋予空间并复制0
fmt.Printf("len = %d, slice =%v\n", len(slice1),slice1)


/*
声明slice是切片,但是没有分配空间
*/
var slice2 []int
fmt.Printf("len = %d, slice =%v\n", len(slice2),slice2)

//slice2[0]=2 //直接赋予数值会出现错误,越界
slice2 = make([]int,3)
//开辟空间,但是默认值都是0
fmt.Printf("len = %d, slice =%v\n", len(slice2),slice2)
slice2[0]=1000
fmt.Printf("len = %d, slice =%v\n", len(slice2),slice2)
//此时就修改成功

/*
声明slice类型,同时分配空间
*/
var slice3 =make([]int,5)
fmt.Printf("len = %d, slice =%v\n", len(slice3),slice3)


/*
判断一个slice切片是不是为0
*/
if slice1 == nil{
fmt.Println("slice1 is null")
}else{
fmt.Println("slice1 is not null")
}
}
+

注意if else的格式有要求

+
+ + +
+
+ + +
+
+ + +
+

关于切片的截取操作

+
/* 
切片的截取
*/
var slice6 = make([]int,3)
slice6[0]=1
slice6[2]=33
fmt.Printf("len = %d, cap = %d, slice =%v\n", len(slice6), cap(slice6), slice6)
//截取的过程中是左闭右开
s1:=slice6[0:2]
// s1:=slice6[:]//表示截取全部
fmt.Println(s1)
//注意此时的s1的地址和slice6的位置一样了

//copy
var s2 = make([]int,3)
copy(s2,slice6)
fmt.Println(s2)// 只会从头开始截取s2长度的,如果长了那么就是0,
//否则就是选择slice6中相同长度的元素,从左到右边
+

map的操作

+

反射

+

变量结构

+
+ + +
]]> 后端开发