go的并发初体验、加锁、异步

简介: go的并发初体验、加锁、异步

一、使用关键字go并发

package groutine_test
 
import (
  "fmt"
  "testing"
  "time"
)
 
func TestGroutine(t *testing.T) {
  for i := 0; i < 10; i++ {
    //启动协程
    go func(i int) {
      fmt.Println(i)
    }(i)
  }
  time.Sleep(time.Millisecond * 50)
}
=== RUN   TestGroutine
9
5
6
7
8
1
0
2
3
4
--- PASS: TestGroutine (0.05s)
PASS

二、并发锁

package share_mem
 
import (
  "sync"
  "testing"
  "time"
)
 
//协程不安全
func TestCounter(t *testing.T) {
  counter := 0
  for i := 0; i < 5000; i++ {
    //并发计数
    go func() {
      counter++
    }()
  }
  time.Sleep(time.Second * 1)
  t.Logf("counter=%d", counter)
}
//协程安全
func TestCounterThreadSafe(t *testing.T) {
  //获取锁
  var mut sync.Mutex
  counter := 0
  for i := 0; i < 5000; i++ {
    //并发计数
    go func() {
      //延迟解锁
      defer func() {
        mut.Unlock()
      }()
      //加锁
      mut.Lock()
      counter++
    }()
  }
  time.Sleep(time.Second * 1)
  t.Logf("counter=%d", counter)
}
 
//WaitGroup 所有组完成后,继续执行
func TestCounterWaitGroup(t *testing.T) {
  //获取锁
  var wg sync.WaitGroup
  var mut sync.Mutex
  counter := 0
  for i := 0; i < 5000; i++ {
    wg.Add(1)
    //并发计数
    go func() {
      //延迟解锁
      defer func() {
        mut.Unlock()
      }()
      //加锁
      mut.Lock()
      counter++
      wg.Done()
    }()
  }
  wg.Wait()
  t.Logf("counter=%d", counter)
}

三、异步执行

package csp
 
import (
  "fmt"
  "testing"
  "time"
)
 
//串行
func service() string {
  time.Sleep(time.Millisecond * 50)
  return "Done"
}
 
//串行
func otherTask() {
  fmt.Println("working on somthing else")
  time.Sleep(time.Millisecond * 100)
  fmt.Println("Task is done.")
}
func TestService(t *testing.T) {
  fmt.Println(service())
  otherTask()
}
 
//异步 chan在go中是一个通道有可读可写的chan,也存在只读只写的chan 异步返回
func AsyncService() chan string {
  //创建接受通道
  retCh := make(chan string, 1)
  go func() {
    ret := service()
    fmt.Println("returned result.")
    //chan放数据
    retCh <- ret
    fmt.Println("service exited.")
  }()
  return retCh
}
func TestAsynService(t *testing.T) {
  retCh := AsyncService()
  otherTask()
  //chan取数据
  fmt.Println(<-retCh)
  //time.Sleep(time.Second * 1)
}

异步执行后,快乐0.06s

相关文章
|
1月前
|
存储 负载均衡 监控
如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
在数字化时代,构建高可靠性服务架构至关重要。本文探讨了如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
34 1
|
1月前
|
Go 调度 开发者
探索Go语言中的并发模式:goroutine与channel
在本文中,我们将深入探讨Go语言中的核心并发特性——goroutine和channel。不同于传统的并发模型,Go语言的并发机制以其简洁性和高效性著称。本文将通过实际代码示例,展示如何利用goroutine实现轻量级的并发执行,以及如何通过channel安全地在goroutine之间传递数据。摘要部分将概述这些概念,并提示读者本文将提供哪些具体的技术洞见。
|
2月前
|
Java 大数据 Go
Go语言:高效并发的编程新星
【10月更文挑战第21】Go语言:高效并发的编程新星
53 7
|
1月前
|
并行计算 安全 Go
Go语言的并发特性
【10月更文挑战第26天】Go语言的并发特性
19 1
|
2月前
|
安全 Go 调度
探索Go语言的并发模式:协程与通道的协同作用
Go语言以其并发能力闻名于世,而协程(goroutine)和通道(channel)是实现并发的两大利器。本文将深入了解Go语言中协程的轻量级特性,探讨如何利用通道进行协程间的安全通信,并通过实际案例演示如何将这两者结合起来,构建高效且可靠的并发系统。
|
2月前
|
安全 Go 开发者
破译Go语言中的并发模式:从入门到精通
在这篇技术性文章中,我们将跳过常规的摘要模式,直接带你进入Go语言的并发世界。你将不会看到枯燥的介绍,而是一段代码的旅程,从Go的并发基础构建块(goroutine和channel)开始,到高级模式的实践应用,我们共同探索如何高效地使用Go来处理并发任务。准备好,让Go带你飞。
|
2月前
|
安全 程序员 Go
深入浅出Go语言的并发之道
在本文中,我们将探索Go语言如何优雅地处理并发编程。通过对比传统多线程模型,我们将揭示Go语言独特的goroutine和channel机制是如何简化并发编程,并提高程序的效率和稳定性。本文不涉及复杂的技术术语,而是用通俗易懂的语言,结合生动的比喻,让读者能够轻松理解Go语言并发编程的核心概念。
|
23天前
|
并行计算 安全 Go
Go语言中的并发编程:掌握goroutines和channels####
本文深入探讨了Go语言中并发编程的核心概念——goroutine和channel。不同于传统的线程模型,Go通过轻量级的goroutine和通信机制channel,实现了高效的并发处理。我们将从基础概念开始,逐步深入到实际应用案例,揭示如何在Go语言中优雅地实现并发控制和数据同步。 ####
|
28天前
|
存储 Go 开发者
Go语言中的并发编程与通道(Channel)的深度探索
本文旨在深入探讨Go语言中并发编程的核心概念和实践,特别是通道(Channel)的使用。通过分析Goroutines和Channels的基本工作原理,我们将了解如何在Go语言中高效地实现并行任务处理。本文不仅介绍了基础语法和用法,还深入讨论了高级特性如缓冲通道、选择性接收以及超时控制等,旨在为读者提供一个全面的并发编程视角。
|
24天前
|
安全 Serverless Go
Go语言中的并发编程:深入理解与实践####
本文旨在为读者提供一个关于Go语言并发编程的全面指南。我们将从并发的基本概念讲起,逐步深入到Go语言特有的goroutine和channel机制,探讨它们如何简化多线程编程的复杂性。通过实例演示和代码分析,本文将揭示Go语言在处理并发任务时的优势,以及如何在实际项目中高效利用这些特性来提升性能和响应速度。无论你是Go语言的初学者还是有一定经验的开发者,本文都将为你提供有价值的见解和实用的技巧。 ####