go语言移动文件 go语言移动文件是什么

关于在go语言中导入当前文件夹的步骤1.先把要导入的包go build - go install
2.接着在要导入的方法中以: 项目名 / 导入的文件名的形式导入即可(如下方test(项目名) / chiid(文件名))
Go语言os标准库常用方法Getwd/Getenv/Chdir1. os.Getwd()函数
原型:func Getwd()(pwd string, err error)
作用:获取当前文件路径
返回:当前文件路径的字符串和一个err信息
示例:
输出:
当前路径: D:ProjectsGomGoLab01
2. os.Getenv()函数
原型:func Getenv(key string) string
作用:获取系统环境变量的值
参数:key - 系统环境变量名
返回:系统环境变量的值
示例:
输出:
环境变量GOPATH的值是: D:/Projects/Go
3. os.Chdir()函数
原型:func Chdir(dir string) error
作用:将当前文件路径改变为目标路径(非真实改变)
参数:dir - 目标路径(即改变之后的路径)
返回:修改成功,返回 nil;修改失败(如:目标路径不存在的情况),返回错误信息 。
示例一:
输出:
起始路径: D:ProjectsGomGoLab01
修改后的路径: D:ProjectsGoDemo02
示例二:
输出:
起始路径: D:ProjectsGomGoLab01
error: chdir D:ProjectsGoDemo03: The system cannot find the file specified.
注:文件路径,Window 系统下默认是“” , 写在代码中时要用“”或“/”代替 。
【golang详解】go语言GMP(GPM)原理和调度Goroutine调度是一个很复杂go语言移动文件的机制,下面尝试用简单的语言描述一下Goroutine调度机制,想要对其有更深入的了解可以去研读一下源码 。
首先介绍一下GMP什么意思go语言移动文件:
G ----------- goroutine: 即Go协程,每个go关键字都会创建一个协程 。
M ---------- thread内核级线程,所有的G都要放在M上才能运行 。
P ----------- processor处理器 , 调度G到M上,其维护了一个队列,存储了所有需要它来调度的G 。
Goroutine 调度器P和 OS 调度器是通过 M 结合起来的,每个 M 都代表了 1 个内核线程,OS 调度器负责把内核线程分配到 CPU 的核上执行
模型图:
避免频繁的创建、销毁线程,而是对线程的复用 。
1)work stealing机制
当本线程无可运行的G时 , 尝试从其他线程绑定的P偷取G,而不是销毁线程 。
2)hand off机制
当本线程M0因为G0进行系统调用阻塞时 , 线程释放绑定的P,把P转移给其他空闲的线程执行 。进而某个空闲的M1获取P,继续执行P队列中剩下的G 。而M0由于陷入系统调用而进被阻塞 , M1接替M0的工作,只要P不空闲 , 就可以保证充分利用CPU 。M1的来源有可能是M的缓存池,也可能是新建的 。当G0系统调用结束后,根据M0是否能获取到P,将会将G0做不同的处理:
如果有空闲的P,则获取一个P,继续执行G0 。
如果没有空闲的P,则将G0放入全局队列,等待被其他的P调度 。然后M0将进入缓存池睡眠 。
如下图
GOMAXPROCS设置P的数量,最多有GOMAXPROCS个线程分布在多个CPU上同时运行
在Go中一个goroutine最多占用CPU 10ms,防止其他goroutine被饿死 。
具体可以去看另一篇文章
【Golang详解】go语言调度机制 抢占式调度
当创建一个新的G之后优先加入本地队列,如果本地队列满了,会将本地队列的G移动到全局队列里面,当M执行work stealing从其他P偷不到G时,它可以从全局G队列获取G 。
协程经历过程
我们创建一个协程 go func()经历过程如下图:
说明:
这里有两个存储G的队列,一个是局部调度器P的本地队列、一个是全局G队列 。新创建的G会先保存在P的本地队列中,如果P的本地队列已经满了就会保存在全局的队列中;处理器本地队列是一个使用数组构成的环形链表,它最多可以存储 256 个待执行任务 。

推荐阅读