Golang笔记

GoLang Asynchronous 异步实现的例子

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

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

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 秒
异步任务做完 耗时 5秒
add project :an-asynchronous-project
done

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

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

例子代码引用自 http://golanghome.com/post/529 49

本文网址: https://golangnote.com/topic/48.html (转载注明出处)
关于GolangNote:记录在工作中使用golang 遇到、面临的相关问题及解决方法。如果你在这里获得一些知识或信息,解决你的编程问题,请考虑捐赠给不幸的人或者你喜欢的慈善机构,除捐赠外,种植树木、志愿服务或减少排碳的行为也很有益处。如果你有任何问题可以在下面 留言
Be the first to comment!
Captcha image
Relative Articles