前言

Golang,由于它本身就支持并发,所以对于开发者来说,能够快速的开发出具备高并发的高性能程序,所以,这篇文章主要说一下 go怎么简单快速的实现高并发

Python 中,由于 Python本身的特性,仅仅支持伪多线程,你要学习多进程,就需要学习很多多线程的库的调用,要使用更高性能的协程,就需要了解支持并发的库 asyncioaiohttp 等,并且学习难度是比较高的。

但是在Golang中,你不需要学习如何创建进程池或者线程池,也不需要知道什么情况下使用多线程,什么时候使用多进程,因为你没得选,也不需要选,它原生提供的 goroutine (也即协程)已经足够优秀,能够自动帮你处理好所有的事情,而你要做的只是执行它,就这么简单。

一个 goroutine 本身就是一个函数,当你直接调用时,它就是一个普通函数,如果你在调用前加一个关键字 go ,那你就开启了一个 goroutine

详解

代码:

package main

import "fmt"

func handle()  {
    fmt.Println("hello golang")
}

func main() {
    go handle()
    fmt.Println("hello main")
}

可以看到,我们使用了 go去调用了 handle,但是并没有输出 handle中的 hello golang,这是为什么呢?

因为创建一个 goroutine也是需要时间的,即使这个时间很短,但是程序已经执行完了,所以只输出了 main中的 hello main

所以,我们在 main 中休眠一下:

package main

import (
    "fmt"
    "time"
)

func handle()  {
    fmt.Println("hello golang")
}

func main() {
    go handle()
    fmt.Println("hello main")
    time.Sleep(1 * time.Second)
}

可以看到两个都成功输出了,并且由于使用了 go去调用 handle,然后创建 goroutine消耗了时间,但是程序并没有阻塞,而是直接继续运行,输出了 hello main,然后子啊休眠的过程中,goroutine创建完成,执行 handle,输出 hello golang,休眠结束,程序也结束运行

下面的例子可以更好的看到并发的效果:

package main

import (
    "fmt"
    "time"
)

func gohandle(name string) {
    for i := 0; i < 5; i++ {
        fmt.Printf("In goroutine %s\n", name)
        time.Sleep(10 * time.Millisecond)
    }
}

func main() {
    go gohandle("协程1号")
    go gohandle("协程2号")
    time.Sleep(time.Second)
}

可以看到,两个协程就像两个线程一样,并发执行

写在最后

通过几个简单的例子,可以看出,Go的这种强大的并发特性,将同步代码转化为异步代码只需要一个简单的关键字:go,就可以实现,而不需要过多的代码实现

本文只是简单的举个列子,下次会更加优雅的实现协程

最后修改:2020 年 07 月 30 日
如果觉得我的文章对你有用,请随意赞赏