异步是接到任务后不立即返回实行结果,而是跟他说:我接到任务了,等我完成了就给你返回结果。
如果你不是等不到结果就无法进行下去的话,你完全可以先干别的事情。下面用个完整的例子说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
package main
import (
"fmt"
"time"
)
type user struct {
name string
}
//一个查询结构体
type project struct {
//参数Channel
name chan string
result chan string
}
//addProject
func addProject(u user, p project) {
fmt.Println("开始异步任务")
//检查用户权限
//checkPermission(u)
//启动协程
go func() {
fmt.Println("另一个协程实行异步任务")
time.Sleep(time.Second * 5)
//获取输入
name := <-p.name
//访问数据库,输出结果通道
p.result <- "add project :" + name
fmt.Println("异步任务做完 耗时 5秒")
}()
}
//主进程
func main() {
//初始化project
p := project{make(chan string, 1), make(chan string, 1)}
//某位用户
u := user{}
//执行addProject,注意执行的时候还不需要告知要创建的项目名字
addProject(u, p)
//准备参数
p.name <- "an-asynchronous-project" // 异步调用
t := 1
fmt.Println("正在干别的事。。。")
// 可以在这里先干别的事
time.Sleep(time.Second * time.Duration(t))
fmt.Println("别的事干完。耗时", t, "秒")
//获取结果
fmt.Println(<-p.result) // 这里要等到异步任务做完,这里会阻塞主进程
fmt.Println("done")
}
运行输出:
1 2 3 4 5 6 7
开始异步任务
正在干别的事。。。
另一个协程实行异步任务
别的事干完。耗时 1 秒
异步任务做完 耗时 5秒
add project :an-asynchronous-project
done
如果把主线进程的实行任务时间t 改为8秒,则输出:
1 2 3 4 5 6 7
开始异步任务
正在干别的事。。。
另一个协程实行异步任务
异步任务做完 耗时 5秒
别的事干完。耗时 8 秒
add project :an-asynchronous-project
done
本文网址: https://golangnote.com/topic/48.html 转摘请注明来源