异步是接到任务后不立即返回实行结果,而是跟他说:我接到任务了,等我完成了就给你返回结果。
如果你不是等不到结果就无法进行下去的话,你完全可以先干别的事情。下面用个完整的例子说明:
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 转摘请注明来源