golang 管道与goroutine

当我们去数据库取数据时,如果按照顺序执行,将耗费很多等待数据库查询的时间,在go中常用携程和管道实现并发操作。

下面有两个示例,模拟使用orm在数据库取数花费时间:

package main

import (
	"fmt"
	"time"
)

func main() {

	Task()
	TaskWithGoroutine()

}

func Task() {

	startTime := time.Now().UnixNano()

	// 第一个任务: 数据库取数据
	time.Sleep(2 * time.Second)

	// 第二个任务
	time.Sleep(2 * time.Second)

	endTime := time.Now().UnixNano() // 结束计时
	Millisecond := float64((endTime - startTime) / 1e6)
	fmt.Printf("Task() finished in %f ms\n", Millisecond)
}

func TaskWithGoroutine() {

	startTimes := time.Now().UnixNano()
	ch1 := make(chan int)    // 无缓冲
	ch2 := make(chan int, 1) // 有缓冲

	// 第一任务花费两秒
	go func() {
		defer fmt.Println("task1 done")
		time.Sleep(2 * time.Second)
		ch1 <- 11
	}()

	// 第二任务花费两秒
	go func() {
		defer fmt.Println("task2 done")
		time.Sleep(2 * time.Second)
		ch2 <- 11
	}()

	// 读取管道
	<-ch1

	<-ch2

	endTimes := time.Now().UnixNano() // 结束计时
	Milliseconds := float64((endTimes - startTimes) / 1e6)
	fmt.Printf("TaskWithGoroutine() finished in %f ms\n", Milliseconds)

}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值