做网站必须要dreamever,站内推广的方法,建设论坛网站,tp5 商城网站开发前言 Go 语言中#xff0c;协程是通过 go 关键字来创建的#xff0c;这使得 Go 语言成为实现并发程序的一个非常直观和强大的工具。Go 运行时管理着协程#xff0c;这些协程在内部被称为 goroutine。 协程#xff08;goroutines#xff09;本身是轻量级的线程#xff0c;…前言 Go 语言中协程是通过 go 关键字来创建的这使得 Go 语言成为实现并发程序的一个非常直观和强大的工具。Go 运行时管理着协程这些协程在内部被称为 goroutine。 协程goroutines本身是轻量级的线程由 Go 运行时管理。它们设计为非阻塞的因为 Go 运行时会在一个协程阻塞时例如由于I/O操作自动切换到其他协程继续执行从而提高程序的并发性能。
一、测试用例
package mainimport (fmttime
)// 定义一个函数该函数将由协程执行
func printNumbers() {for i : 0; i 10; i {fmt.Println(i)// 延时处理time.Sleep(100 * time.Millisecond)}
}func main() {// 使用 go 关键字启动协程go printNumbers()// 非阻塞 主函数继续执行不会等待协程完成for i : 0; i 5; i {fmt.Printf(Main is running: %d\n, i)time.Sleep(200 * time.Millisecond)}}
程序的退出依赖于主函数的结束但在go语言中协程是并发运行的它们有自己的执行栈和运行状态。如果协程在主函数结束后还在运行它们将继续执行直到协程执行完毕自然退出。
二、协程与通道的使用
package mainimport (fmtsync
)func consumer(id int, ch -chan int, wg *sync.WaitGroup) {for n : range ch {fmt.Printf(Consumer %d received %d\n, id, n)}wg.Done()
}func main() {ch : make(chan int)var wg sync.WaitGroupfor i : 1; i 3; i {wg.Add(1)go consumer(i, ch, wg)}for n : 1; n 9; n {ch - n}close(ch)wg.Wait()fmt.Println(All consumers are done.)
}
协程goroutines和通道channels是并发编程的两个基本工具经常结合在一起使用以实现复杂的并发模式。协程是轻量级的线程而通道提供了协程之间的通信机制。
以上的生产者-消费者模式创建了三个消费者的协程并往通道中写入数据协程再将数据进行打印输出。通道用来在协程之间传递数据也作为同步机制来控制协程的执行顺序。