异步是接到任务后不立即返回实行结果,而是跟他说:我接到任务了,等我完成了就给你返回结果。

GoLang Asynchronous

如果你不是等不到结果就无法进行下去的话,你完全可以先干别的事情。下面用个完整的例子说明:

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 转摘请注明来源