您的位置:首页 > 文旅 > 美景 > 海南seo排名_北京设计公司招聘_武汉网络关键词排名_百度云搜索资源入口

海南seo排名_北京设计公司招聘_武汉网络关键词排名_百度云搜索资源入口

2025/1/16 5:16:38 来源:https://blog.csdn.net/hzether/article/details/144972579  浏览:    关键词:海南seo排名_北京设计公司招聘_武汉网络关键词排名_百度云搜索资源入口
海南seo排名_北京设计公司招聘_武汉网络关键词排名_百度云搜索资源入口

第6章:Go语言并发编程

6.1 并发基础概念

6.1.1 并发vs并行

// 并发示例:模拟多任务处理
func main() {// 并发执行多个任务go task1()go task2()// 主goroutine继续执行time.Sleep(time.Second)
}func task1() {fmt.Println("任务1执行")
}func task2() {fmt.Println("任务2执行")
}

6.1.2 Goroutine

// Goroutine基本使用
func printNumbers() {for i := 1; i <= 5; i++ {time.Sleep(100 * time.Millisecond)fmt.Printf("数字:%d\n", i)}
}func printLetters() {for i := 'a'; i <= 'e'; i++ {time.Sleep(150 * time.Millisecond)fmt.Printf("字母:%c\n", i)}
}func main() {go printNumbers()go printLetters()// 等待goroutine执行time.Sleep(time.Second)
}

6.2 通道(Channel)

6.2.1 基本通道操作

func main() {// 创建无缓冲通道ch := make(chan int)// 发送和接收go func() {ch <- 42  // 发送}()value := <-ch  // 接收fmt.Println(value)
}// 带缓冲的通道
func bufferedChannelDemo() {ch := make(chan string, 3)ch <- "Hello"ch <- "World"ch <- "Go"fmt.Println(<-ch)  // 依次输出
}

6.2.2 通道方向

// 只读通道
func receiver(ch <-chan int) {for value := range ch {fmt.Println("接收:", value)}
}// 只写通道
func sender(ch chan<- int) {for i := 0; i < 5; i++ {ch <- i}close(ch)
}func main() {ch := make(chan int)go sender(ch)receiver(ch)
}

6.3 并发模式

6.3.1 生产者-消费者模式

func producer(ch chan<- int) {for i := 0; i < 10; i++ {ch <- itime.Sleep(100 * time.Millisecond)}close(ch)
}func consumer(ch <-chan int, done chan<- bool) {for value := range ch {fmt.Println("消费:", value)}done <- true
}func main() {ch := make(chan int)done := make(chan bool)go producer(ch)go consumer(ch, done)<-done  // 等待消费者完成
}

6.3.2 select多路复用

func main() {ch1 := make(chan string)ch2 := make(chan string)go func() {time.Sleep(time.Second)ch1 <- "通道1"}()go func() {time.Sleep(2 * time.Second)ch2 <- "通道2"}()select {case msg1 := <-ch1:fmt.Println(msg1)case msg2 := <-ch2:fmt.Println(msg2)case <-time.After(3 * time.Second):fmt.Println("超时")}
}

6.4 同步原语

6.4.1 互斥锁

type SafeCounter struct {mu sync.Mutexcounter int
}func (c *SafeCounter) Increment() {c.mu.Lock()defer c.mu.Unlock()c.counter++
}func (c *SafeCounter) Value() int {c.mu.Lock()defer c.mu.Unlock()return c.counter
}func main() {counter := &SafeCounter{}for i := 0; i < 1000; i++ {go counter.Increment()}time.Sleep(time.Second)fmt.Println(counter.Value())
}

6.4.2 读写锁

type Cache struct {mu sync.RWMutexdata map[string]int
}func (c *Cache) Read(key string) (int, bool) {c.mu.RLock()defer c.mu.RUnlock()value, ok := c.data[key]return value, ok
}func (c *Cache) Write(key string, value int) {c.mu.Lock()defer c.mu.Unlock()c.data[key] = value
}

6.4.3 原子操作

var counter int64func incrementCounter() {atomic.AddInt64(&counter, 1)
}func getCounter() int64 {return atomic.LoadInt64(&counter)
}

6.5 并发实践

6.5.1 并行爬虫

func fetchURL(url string, ch chan<- string) {resp, err := http.Get(url)if err != nil {ch <- fmt.Sprintf("错误: %v", err)return}defer resp.Body.Close()body, _ := ioutil.ReadAll(resp.Body)ch <- fmt.Sprintf("URL: %s, 长度: %d", url, len(body))
}func main() {urls := []string{"https://www.example.com","https://www.google.com","https://www.github.com",}ch := make(chan string, len(urls))for _, url := range urls {go fetchURL(url, ch)}for i := 0; i < len(urls); i++ {fmt.Println(<-ch)}
}

6.5.2 并发限流

func worker(id int, jobs <-chan int, results chan<- int) {for job := range jobs {fmt.Printf("Worker %d 处理任务 %d\n", id, job)time.Sleep(time.Second)results <- job * 2}
}func main() {jobs := make(chan int, 100)results := make(chan int, 100)// 创建固定数量的工作goroutinefor w := 1; w <= 3; w++ {go worker(w, jobs, results)}// 发送任务for j := 1; j <= 5; j++ {jobs <- j}close(jobs)// 收集结果for a := 1; a <= 5; a++ {fmt.Println(<-results)}
}

实践项目:简单的并发聊天服务器

type Client struct {conn net.Connsend chan string
}type ChatServer struct {clients    map[*Client]boolbroadcast  chan stringregister   chan *Clientunregister chan *Client
}func (server *ChatServer) run() {for {select {case client := <-server.register:server.clients[client] = truecase client := <-server.unregister:if _, ok := server.clients[client]; ok {delete(server.clients, client)close(client.send)}case message := <-server.broadcast:for client := range server.clients {select {case client.send <- message:default:close(client.send)delete(server.clients, client)}}}}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com