Browse Source

通道与协程

YWJL 2 years ago
parent
commit
c320ff84b6

+ 44 - 5
Go语言核心36讲/10/main.go

@@ -1,10 +1,49 @@
 package main
 
-import "fmt"
+import (
+	"fmt"
+	"runtime"
+	"sync"
+)
 
 func main() {
-	fmt.Println("Hello, world!")
-	test := make([]int, 3)
-	test2 := []int{}
-	fmt.Println(test, test2)
+	// wg用来等待程序完成
+	var wg sync.WaitGroup
+
+	// 分配一个逻辑处理器给调度器使用
+	runtime.GOMAXPROCS(2)
+
+	// 计数加2,表示要等待两个goroutine
+	wg.Add(2)
+	func() {
+		fmt.Println("hello")
+	}()
+
+	// 创建两个goroutine
+	fmt.Println("Create Goroutines")
+	go printPrime("A", &wg)
+	go printPrime("B", &wg)
+
+	// 等待goroutine结束
+	fmt.Println("Waiting To Finish")
+	wg.Wait()
+
+	fmt.Println("Terminating Program")
+}
+
+// printPrime 显示5000以内的素数值
+func printPrime(prefix string, wg *sync.WaitGroup) {
+	// 在函数退出时调用Done来通知main函数工作已经完成
+	defer wg.Done()
+
+next:
+	for outer := 2; outer < 5000; outer++ {
+		for inner := 2; inner < outer; inner++ {
+			if outer%inner == 0 {
+				continue next
+			}
+		}
+		fmt.Printf("%s:%d\n", prefix, outer)
+	}
+	fmt.Println("Completed", prefix)
 }

BIN
Go语言核心36讲/10/read.assets/image-20220628225339441.png


BIN
Go语言核心36讲/10/read.assets/image-20220628235019239.png


+ 41 - 0
Go语言核心36讲/10/read.md

@@ -0,0 +1,41 @@
+# 通道的基本操作
+
+## 0.资料
+
+1. https://gfw.go101.org/article/channel.html
+2. https://www.cnblogs.com/liang1101/p/7285955.html
+3. https://www.cnblogs.com/sparkdev/p/10930168.html
+
+## 1. 特性
+
+1. 对于同一个通道,发送操作之间是互斥的,接收操作之间也是互斥的。(入和出的互斥性)
+2. 发送操作和接收操作中对元素值的处理都是不可分割的。(入和出的原子性)
+3. 发送操作在完全完成之前会被阻塞。接收操作也是如此。
+
+### 说明
+
+1. 通道类型值,本身是并发安全的
+2. 并发执行,是多个代码块分别在不同的 goroutine 之中,并有机会在同一个时间段内被执行。(并发不是同时执行)
+3. 通道分缓冲通道和非缓冲通道
+
+## 2. panic
+
+1. 向已经关闭的channel写。
+2. 关闭已经关闭的channel。
+
+## 3.阻塞
+
+![image-20220628235019239](read.assets/image-20220628235019239.png)
+
+
+
+# 2. 协程(gorountine)
+
+1. 进程、线程(内核级线程)、协程(用户级线程)三个概念
+2. 进程、线程由内核调度,有CPU时间片的概念,有多种调度算法
+3. 协程(用户级线程)对内核透明,即系统不知道有协程的存在,是完全由用户自己的程序进行调度控制的。
+4. https://learnku.com/articles/41405
+
+![image-20220628225339441](read.assets/image-20220628225339441.png)
+
+**Go 协程(goroutine)通过信道(channel)进行通信**。信道可以防止多个协程访问共享内存时发生资源争抢的问题。