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

目录
相关文章
|
10天前
|
存储 算法 Go
go语言并发实战——日志收集系统(七) etcd的介绍与简单使用
go语言并发实战——日志收集系统(七) etcd的介绍与简单使用
|
10天前
|
监控 Go
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
|
10天前
|
监控 Go
go语言并发实战——日志收集系统(十一)基于etcd来监视配置文件的变化
go语言并发实战——日志收集系统(十一)基于etcd来监视配置文件的变化
|
10天前
|
监控 Go
go语言并发实战——日志收集系统(十) 重构tailfile模块实现同时监控多个日志文件
go语言并发实战——日志收集系统(十) 重构tailfile模块实现同时监控多个日志文件
|
10天前
|
存储 JSON 监控
go语言并发实战——日志收集系统(九) 基于etcd的代码重构思考与初步实现
go语言并发实战——日志收集系统(九) 基于etcd的代码重构思考与初步实现
我的Go+语言初体验——祝福留言小系统,让她也可以感受到你的祝福(上)
环境搭建 GO+版的祝福语管理系统 前期想法 界面展示 整体界面 增加祝福信息 修改操作 删除操作 退出
我的Go+语言初体验——祝福留言小系统,让她也可以感受到你的祝福(上)
|
7天前
|
安全 测试技术 Go
Go语言在高并发场景下的应用
在当今互联网高速发展的时代,高并发已成为众多应用系统面临的核心问题。本文探讨了Go语言在高并发场景下的优势,并通过具体实例展示了其在实际应用中的效果和性能表现。
|
4天前
|
Go
go语言map、实现set
go语言map、实现set
11 0
|
4天前
|
Go
go语言数组与切片
go语言数组与切片
14 0
|
1天前
|
JSON 算法 测试技术
在go语言中调试程序
【6月更文挑战第29天】Go语言内置`testing`包支持单元测试、基准测试和模糊测试。`go test`命令可执行测试,如`-run`选择特定测试,`-bench`运行基准测试,`-fuzz`进行模糊测试。
12 2
在go语言中调试程序