GolangNote

Golang笔记

GoLang Asynchronous 异步实现的例子

Permalink

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

GoLang Asynchronous

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

Go: 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")
}

运行输出:

Bash: output
1
2
3
4
5
6
7
开始异步任务
正在干别的事。。。
另一个协程实行异步任务
别的事干完。耗时 1
异步任务做完 耗时 5秒
add project :an-asynchronous-project
done

如果把主线进程的实行任务时间t 改为8秒,则输出:

Bash: output
1
2
3
4
5
6
7
开始异步任务
正在干别的事。。。
另一个协程实行异步任务
异步任务做完 耗时 5秒
别的事干完。耗时 8
add project :an-asynchronous-project
done

本文网址: https://golangnote.com/topic/48.html 转摘请注明来源

Related articles

Golang phantomjs 动态代理实现

phantomjs 是个很优秀的软件,虽然现在被chrome headless 抢了风头,但在某些特定场合,使用phantomjs 还是很方便,这里是介绍使用Go 实现动态代理。...

Golang实现简单的Socks5代理

Socks5 代理较 `http/https` 代理有较好的性能,下面是借鉴某个著名开源软件的 local 实现的简单代理。...

Write a Comment to "GoLang Asynchronous 异步实现的例子"

Submit Comment Login
Based on Golang + fastHTTP + sdb | go1.17.1 Processed in 0ms