golang有进程。进程就是程序在操作系统中的一次执行过程,是由系统进行资源分配和调度的基本单位;进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。go语言支持多进程,它线程模型是mpg模型,整体上go程与内核线程是多对多对应的。
本教程操作环境:windows7系统、go 1.18版本、dell g3电脑。
一、关于进程和线程1. 进程(process)进程就是程序在操作系统中的一次执行过程,是由系统进行资源分配和调度的基本单位,进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。一个进程至少有5种基本状态:初始态、执行态、等待状态、就绪状态、终止状态。
通俗讲:进程就是一个正在执行的程序。
2. 线程线程是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位。
通俗讲:一个进程可以创建多个线程,同一个进程中的多个线程可以并发执行,一个程序要运行的话至少有一个进程。
二、关于并发和并行1. 并发多个线程同时竞争一个位置,竞争到的才可以执行,每一个时间段只有一个线程在执行。
2. 并行多个线程可以同时执行,每一个时间段,可以有多个线程同时执行。
3. 通俗讲多线程程序在单核cpu上运行就是并发,在多核cpu上运行就是并行。如果线程数大于cpu核数,则多线程程序在多个cpu上既有并发也有并行。
三、goroutine协程以及主线程1. 主线程可以理解为线程或进程,在一个golang程序的主线程上可以启用多个协程。golang中多协程可以实现并发或者并行。
2. 协程可以理解为用户级别的线程,这是对内核透明的,也就是系统并不知道有协程的存在,是完全由用户自己的程序进行调度的。golang的一大特色就是从语言方面原生支持协程,在函数或方法前面加一个go关键词就可以创建一个协程。可以说golang中的协程就是goroutine。
golang 中的多协程有点类似其他语言中的多线程。
3. 多协程和多线程golang 中每个 goroutine (协程) 默认占用内存远比 java 、c 的线程少。 os 线程(操作系统线程)一般都有固定的栈内存(通常为 2mb 左右),一个 goroutine (协程) 占用内存非常小,只有 2kb 左右,多协程 goroutine 切换调度开销方面远比线程要少。 这也是为什么越来越多的大公司使用 golang 的原因之一。
四、go关键词实操1. 顺序执行package mainimport fmtfunc test() {	for i := 0; i < 5; i++ {		fmt.println(test执行, i)	}}func main() {    // 正常顺序执行	test()	for i := 0; i < 5; i++ {		fmt.println(main执行, i)	}	/*		test执行 0		test执行 1		test执行 2		test执行 3		test执行 4		main执行 0		main执行 1		main执行 2		main执行 3		main执行 4	*/}
2. 加入gopackage mainimport fmtfunc test() {	for i := 0; i < 5; i++ {		fmt.println(test执行, i)	}}func main() {    // 加入goroutine后	go test()	for i := 0; i < 5; i++ {		fmt.println(main执行, i)	}	/*		main执行 0		main执行 1		main执行 2		main执行 3		main执行 4		主线程执行完毕后,并没有等待协程的执行	*/}
3. 加入时间package mainimport (    fmt    time)// 加入时间func test1() {	for i := 0; i < 5; i++ {		fmt.println(test执行, i)		time.sleep(time.millisecond * 100)	}}func main() {    // 加入sleep之后再执行	go test1()	for i := 0; i < 5; i++ {		fmt.println(main执行, i)		time.sleep(time.millisecond * 100)	}	/*		main执行 0		test执行 0		test执行 1		main执行 1		main执行 2		test执行 2		main执行 3		test执行 3		test执行 4		main执行 4		加入相同的睡眠时间后,执行的顺序不一定,但少量数据来看均会执行完毕	*/}
4. 主线程执行快的情况package mainimport (    fmt    time)func test1() {	for i := 0; i < 5; i++ {		fmt.println(test执行, i)		time.sleep(time.millisecond * 100)	}}func main() {    // 如果主线程执行的快会出现什么情况?	go test1()	for i := 0; i < 5; i++ {		fmt.println(main执行, i)		time.sleep(time.millisecond * 20)	}	/*		main执行 0		test执行 0		main执行 1		main执行 2		main执行 3		main执行 4		test执行 1		那么他将不会等待协程执行,就会退出执行。	*/}
5. sync.waitgroup解决不等待package mainimport (    fmt    time    sync)var wg sync.wiatgroupfunc test2() {	for i := 0; i < 5; i++ {		fmt.println(test执行, i)		time.sleep(time.millisecond * 100)	}	wg.done()}func main() {    // sync.waitgroup 完美解决,以后在项目中也会经常使用	wg.add(1)	go test2()	for i := 0; i < 5; i++ {		fmt.println(main执行, i)		time.sleep(time.millisecond * 20)	}	wg.wait()	/*		main执行 0		test执行 0		main执行 1		main执行 2		main执行 3		main执行 4		test执行 1		test执行 2		test执行 3		test执行 4		这样就可以解决主线程执行完毕后,不等待等待协程执行完毕就退出的问题。	*/}
6. 多协程并发并行执行package mainimport (    fmt    time    sync)func hello(num int) {	defer wg.done()	for i := 0; i < 5; i++ {		fmt.printf(第%v个协程执行--%v\n, num, i)	}}func main() {    // 多协程并发执行	for i := 0; i < 3; i++ {		wg.add(1)		go hello(i)	}	wg.wait()	/*		第2个协程执行--0		第2个协程执行--1		第2个协程执行--2		第2个协程执行--3		第2个协程执行--4		第0个协程执行--0		第0个协程执行--1		第0个协程执行--2		第0个协程执行--3		第0个协程执行--4		第1个协程执行--0		第1个协程执行--1		第1个协程执行--2		第1个协程执行--3		第1个协程执行--4	*/}
五、设置golang运行时占用的cpu核数量(不是很重要)package mainimport (    fmt    runtime)func main() {    // 设置程序占用几个cpu进行执行,默认是全部	// 获取计算机cpu个数	cpunum := runtime.numcpu()	fmt.println(cpunum) // 6 我本机电脑是6核cpu	// 设置占用cpu个数	runtime.gomaxprocs(2)	fmt.println(ok)}
更多编程相关知识,请访问:编程视频!!
以上就是golang有进程吗的详细内容。
   
 
   