golang 之并发数控制以及互斥锁

 假设1000个任务,每个任务需要耗时3秒,如何快速处理完这1000个任务,当然是并发执行喽。

直接上代码

package main

import (
	"fmt"
	"strconv"
	"sync"
	"time"
)

var count int
var countGard sync.Mutex

func print(str string, wg *sync.WaitGroup) {
	countGard.Lock()
	count += 1
	countGard.Unlock()
	time.Sleep(time.Second * 3)
	fmt.Println(str)

	defer wg.Done()

}

func main() {

	start := time.Now().Unix()

	wg := sync.WaitGroup{}

	// 生产一些任务 这里用打印字符串来模拟
	var datasli []string
	for i := 1000; i > 0; i-- {
		pri_str := strconv.Itoa(i)
		datasli = append(datasli, pri_str+"ABC")

	}

	for _, val := range datasli {
		// 一个任务开启一个 goroutine
		wg.Add(1)
		go print(val, &wg)

	}

	wg.Wait()
	end := time.Now().Unix()
	fmt.Printf("一共并发完成%d个任务,一共耗时%d秒", count, end-start)

	//每个goroutine  顺序是不可知到。速度也不可知到,所以每次输出顺序不同。
	//
}

输出如下,只截取部分输出


357ABC
63ABC
62ABC
60ABC
15ABC
946ABC
904ABC
8ABC
53ABC
483ABC
2ABC
33ABC
86ABC
31ABC
85ABC
84ABC
83ABC
80ABC
942ABC
29ABC
492ABC
28ABC
26ABC
24ABC
21ABC
22ABC
367ABC
16ABC
71ABC
684ABC
76ABC
900ABC
75ABC
352ABC
52ABC
7ABC
50ABC
49ABC
910ABC
11ABC
10ABC
9ABC
4ABC
6ABC
5ABC
3ABC
38ABC
39ABC
40ABC
41ABC
79ABC
73ABC
72ABC
17ABC
78ABC
1ABC
13ABC
一共并发完成1000个任务,一共耗时3秒

我们看到每个goroutine 执行的顺序是不确定的。从耗时可以看到go 语言并发效果是相当给力的。

如果是依次执行任务,3000秒,接近1个小时。时间就是效率,时间就是金钱啊。

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值