Golang协程

简介: Golang协程

go协程


基本使用


Go 协程是与其他函数或方法一起并发运行的函数或方法。Go 协程可以看作是轻量级线程。与线程相比,创建一个 Go 协程的成本很小。因此在 Go 应用中,常常会看到有数以千计的 Go 协程并发地运行。

ex 1:

package main
import "fmt"
func hello () {
   fmt.Println("hello goroutine")
}
func main () {
   go hello()
   fmt.Println("main func")
}

上面的程序会返回以下两个结果,造成差异的主要原因是协程调用后会立即返回,不会等待协程执行完毕,而主程序执行完毕后,协程也会被终止,因此只有在主程序终止前,协程的返回才有效。

re 1:

main func

或者

main func

hello goroutine

  • 启动一个新的协程时,协程的调用会立即返回。与函数不同,程序控制不会去等待 Go 协程执行完毕。在调用 Go 协程之后,程序控制会立即返回到代码的下一行,忽略该协程的任何返回值。
  • 如果希望运行其他 Go 协程,Go 主协程必须继续运行着。如果 Go 主协程终止,则程序终止,于是其他 Go 协程也不会继续运行。

基于以上两点,我们可以在调用协程后再调用time包里面的Sleep函数,休眠一段时间后再继续执行主程序,这样主程序便可以在携程执行完毕后再执行。

加入休眠


ex 2:

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

主程序等待协程执行完毕再执行

res 2:

hello goroutine

main func

启动多个协程


ex 3:

package main
import (
   "fmt"
   "time"
)
func numbers () {
   for i := 1; i < 6; i++ {
      time.Sleep(150 * time.Millisecond)
      fmt.Printf("%d ", i)
   }
}
func letters () {
   for i := 'a'; i <= 'e'; i++ {
      time.Sleep(300 * time.Millisecond)
      fmt.Printf("%c ", i)
   }
}
func main () {
   go numbers()
   go letters()
   time.Sleep(3 * time.Second)
   fmt.Println("main")
}

res 3:

1 2 a 3 b 4 5 c d e main

执行步骤如下图所示:

20210709100654667.png

目录
相关文章
|
2月前
|
监控 负载均衡 算法
Golang深入浅出之-Go语言中的协程池设计与实现
【5月更文挑战第3天】本文探讨了Go语言中的协程池设计,用于管理goroutine并优化并发性能。协程池通过限制同时运行的goroutine数量防止资源耗尽,包括任务队列和工作协程两部分。基本实现思路涉及使用channel作为任务队列,固定数量的工作协程处理任务。文章还列举了一个简单的协程池实现示例,并讨论了常见问题如任务队列溢出、协程泄露和任务调度不均,提出了解决方案。通过合理设置缓冲区大小、确保资源释放、优化任务调度以及监控与调试,可以避免这些问题,提升系统性能和稳定性。
66 6
|
10月前
|
并行计算 安全 Go
Golang协程:并发编程的利器
在Go编程语言中,协程(goroutine)是一种轻量级的线程,用于实现并发编程。与传统的线程相比,协程更加高效、简洁,并且易于使用。本篇博客将深入探讨Golang中的协程及其优势。
71 0
|
Linux Go
学习golang(12) 初探:协程(3)多个chan之select选择器
学习golang(12) 初探:协程(3)多个chan之select选择器
186 0
|
缓存 Go
学习golang(11) 初探:协程(2) 协程间通信
学习golang(11) 初探:协程(2) 协程间通信
178 0
|
Shell Go 调度
学习golang(10) 初探:协程(1)
学习golang(10) 初探:协程(1)
123 0
|
Java Go 调度
Golang中的协程(goroutine)
Golang中的协程(goroutine)
78 0
golang 循环创建新协程,发现每次使用的循环变量都一样,都是最后一个
golang 循环创建新协程,发现每次使用的循环变量都一样,都是最后一个
golang 循环创建新协程,发现每次使用的循环变量都一样,都是最后一个
|
Go 调度 Python
大道如青天,协程来通信,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang通道channel的使用EP14
众所周知,Go lang的作用域相对严格,数据之间的通信往往要依靠参数的传递,但如果想在多个协程任务中间做数据通信,就需要通道(channel)的参与,我们可以把数据封装成一个对象,然后把这个对象的指针传入某个通道变量中,另外一个协程从这个通道中读出变量的指针,并处理其指向的内存对象。
大道如青天,协程来通信,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang通道channel的使用EP14
golang 协程并发代码 demo
golang 协程并发代码 demo
|
Go 调度 开发者
Golang 协程
Go语言中,没有线程概念,只有协程goroutine。 go语言的并发是由go自己决定,对于开发者是透明的,仅需编码时告知启动几个goroutine即可,其余均不关心 和线程相比: - 协程更轻量,一个程序可以启动成千上万个goroutine - 协程是被go runtime 调度执行,线程,由操作系统调度执行。
87 0