Golang Goroutine 入门使用

Goroutine是Golang的轻量级线程,用于实现高并发。本文介绍了Goroutine的使用,包括如何创建和控制协程,以及通过WaitGroup、Context和Channel进行同步和通信。此外,还讨论了在必要时如何安全地共享数据。
摘要由CSDN通过智能技术生成

  goroutine(协程)是golang最重要的特性,是唯一在语言层面支持的主流语言,也是golang主打的优势——“高并发”的实现所在。
 
1.为什么要协程?
2.goroutine怎么用

1.为什么要协程

  追求cpu的最大利用。同一台设备上同时运行着许多的进程,同时向cpu发出许多条指令,在这些指令中,一部分可以马上执行得到结果,但有一些系统IO相关的,它们需要一些输入,比如服务器监听一个端口,一直到客户端连接上才需要继续运行之后的指令;比如等待磁盘读取一个文件。
  这些碎片时间,我们也希望能够利用起来。幸好,系统内核(kernal)会帮我们处理这堆麻烦。我们把一串中途需要等待IO的指令放进一个内核线程中,当需要等待的时候,内核将这个线程的状态保存好,等满足条件的时候,再将这个线程的指令发送给cpu执行,在这期间内,cpu就能处理其他线程的指令,实现cpu的最大利用。
  内核维护线程状态的操作叫做保存现场-恢复现场,这是一个有开销的行为,如果我们的程序只有几个读写文件的操作,那么没关系。使用内核线程的除了我们的自己程序外,还有许许多多正在运行的程序和后台线程,内核线程的切换是我们单个程序控制不了也不应该控制的。但是,如果我们的程序频繁的切换内核线程,这绝对是一件不合理的事情
  于是,大部分语言有了用户级线程和线程池的概念。之前本来交给内核的事情——给cpu分配任务,现在先在程序内部自我合理规划一遍,减少内核线程切换的频率,转而在用户程序内切换。而用户级的线程,因为信息量更少,数据不需要从程序和内核间拷贝,所以消耗更少,更轻量。但这不意味这用户线程就是没有开销的,用户线程还会计入gc,所以一些高频创建销毁的场景下,还会用线程池来管理这些用户线程,尽可能复用。
  golang在内置了线程一个线程池——MPG模型,其中G就代表goroutine,可以认为是一个更轻量级的用户线程。

2.goroutine怎么用

  从上面来看,golang中的协程也并没有高级到哪去,为什么还能以此流行起来呢?
  因为使用简单!

func goHappy() {
   
	//好多代码
	//...
}

  我们想同时运行很多个上面的代码,也就是多线程编程。在golang中我们只需要

go goHappy(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值