一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情。
并发
并发指在同一时间内可以执行多个任务。
Go 语言通过编译器运行时(runtime),从语言上支持了并发的特性。Go 语言的并发通过 goroutine 特性完成。goroutine 类似于线程,但是可以根据需要创建多个 goroutine 并发工作。goroutine 是由 Go 语言的运行时调度完成,而线程是由操作系统调度完成。
比如说一个人在听音乐、吃东西和敲代码。如果是按从上到下执行的话是听完音乐吃东西,吃完东西敲代码,但是如果是并发的话就可以在听音乐的同时吃东西和敲代码。并发可以让编写的程序在同一时刻做很多事情。
进程和线程
启动软件时,操作系统会为软件创建一个进程,这个进程是该软件的工作空间,它包含了软件运行所需的所有资源。线程时进程的执行空间,一个进程可以有多个线程,线程被操作系统调度执行。
协程
Go语言中没有线程的概念,只有协程(goroutine)。Go语言的并发是由Go自己所调度的,自己决定同时执行多少个协程,什么时候执行哪几个。
go 函数名( 参数列表 )
通过go关键字加上一个方法或者一个方法的调用就可以启动一个协程。同一个程序中的所有协程共享同一个地址空间。
示例:
package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("world")
say("hello")
}
以上程序的time.Sleep是让主线程等待一段时间,防止主线程结束退出后程序没有执行完毕。