Golang极简入门教程(三):并发支持
什么是并发
并发是多个任务在同一时间间隔内同时执行的能力。在计算机中,使用线程和进程实现并发。
多线程和多进程
在计算机中,我们可以同时使用多线程和多进程来实现并发。
多线程: 操作系统会创建多个线程,每个线程可以执行不同的任务,这些任务会同时运行。这样可以提高程序的性能,避免单线程运行的资源浪费问题。同时,线程之间可以通过共享内存等方式进行通信。
多进程: 操作系统会创建多个进程,每个进程可以执行不同的任务,这些任务会同时运行。不同的进程之间通过进程间通信的方式进行通信,例如管道、消息队列等方式。不同的进程之间需要花费更多的时间和资源来进行通信。
在Golang中,我们可以通过goroutine来实现并发。
goroutine
goroutine是Golang中一种轻量级的并发方式。一个goroutine可以看做是一个轻量级的线程,可以不用启动新的线程的情况下实现并发。
使用goroutine的步骤:
- 使用关键字
go
,然后在需要并发执行的函数前面加上该关键字; - 执行后,该函数将在goroutine中运行,主程序将继续往下执行。
package main
import (
"fmt"
"time"
)
func main() {
go numbers()
go alphabets()
time.Sleep(5000 * time.Millisecond)
fmt.Println("main terminated")
}
func numbers() {
for i := 1; i <= 5; i++ {
time.Sleep(250 * time.Millisecond)
fmt.Printf("%d ", i)
}
}
func alphabets() {
for i := 'a'; i <= 'e'; i++ {
time.Sleep(300 * time.Millisecond)
fmt.Printf("%c ", i)
}
}
上述程序中,我们创建了两个goroutine,分别是numbers()
和alphabets()
函数。我们在主程序中使用time.Sleep()
让程序等待一段时间,等待两个函数在goroutine中完成执行,最后打印主程序结束语句。
输出:
1 a 2 b 3 c 4 d 5 e main terminated
另外,Golang中的channel是goroutine间通信和同步的主要方式。可以把channel想象成一条流水线,某个goroutine在流水线上放置数据,另一个goroutine在该流水线上取出数据。使用channel时应注意,建议对channel进行带缓冲的声明。
下面是一个带缓冲的channel的例子:
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int, 2) // 带缓冲的channel,大小为2
go func() {
ch <- 1
time.Sleep(1 * time.Second) // 延时1s
ch <- 2
}()
time.Sleep(2 * time.Second) // 延时2s
fmt.Println(<-ch) // 取出第一个数据1
fmt.Println(<-ch) // 取出第二个数据2
}
输出:
1
2
总结
本文介绍了Golang中的goroutine并发支持,以及使用goroutine进行多线程和多进程并发的区别,以及channel的简要使用方法。通过多个示例和说明,帮助入门Golang中的并发编程。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Golang极简入门教程(三):并发支持 - Python技术站