Go 协程是什么?

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

Go 协程相比于线程的优势

  • 相比线程而言,Go 协程的成本极低。堆栈大小只有若干 kb,并且可以根据应用的需求进行增减。而线程必须指定堆栈的大小,其堆栈是固定不变的。
  • Go 协程会复用(Multiplex)数量更少的 OS 线程。即使程序有数以千计的 Go 协程,也可能只有一个线程。如果该线程中的某一 Go 协程发生了阻塞(比如说等待用户输入),那么系统会再创建一个 OS 线程,并把其余 Go 协程都移动到这个新的 OS 线程。所有这一切都在运行时进行,作为程序员,我们没有直接面临这些复杂的细节,而是有一个简洁的 API 来处理并发。
  • Go 协程使用信道(Channel)来进行通信。信道用于防止多个协程访问共享内存时发生竞态条件(Race Condition)。信道可以看作是 Go 协程之间通信的管道。我们会在下一教程详细讨论信道。

如何启动一个 Go 协程?

调用函数或者方法时,在前面加上关键字 go,可以让一个新的 Go 协程并发地运行。

让我们创建一个 Go 协程吧。

package main

import (
"fmt"
) func hello() {
fmt.Println("Hello world goroutine")
}
func main() {
go hello()
//启动一个协程,协程的调用会立即返回,程序会继续执行下一行,因为主协程结束,程序终止,其他的协程也会终止
//time.Sleep(1 * time.Second) 所以我们需要加这行代码才能体现并发
fmt.Println("main function")
}

这就是协程,写起来非常的简便!

最新文章

  1. 初识JavaScript
  2. 快速查找sql server中的存储过程和视图
  3. Ubuntu Server 配置网络
  4. 封装ios静态库碰到的一些问题(三)
  5. Android -- 自定义View小Demo,绘制四位数随机码(一)
  6. Linux环境下实现管道通信-问题
  7. ExtJS4.2 根据数据库记录构建树形菜单
  8. Matlab画柱状和折线对照图
  9. codeigniter nginx rewrite规则配置【转】
  10. bzoj3583: 杰杰的女性朋友 && 4362: Graph
  11. Scrapy框架使用—quotesbot 项目(学习记录一)
  12. Webdriver API之操作(二)
  13. SpriteBuilder中节点的%位置移动
  14. html标签详解(1)
  15. mysql 开发进阶篇系列 12 锁问题(隔离级别下锁的差异)
  16. Testlink1.9.17使用方法(第十一章 其他易用性功能)
  17. win10+vs2015编译caffe的cpu debug版本、部署matcaffe
  18. pandas删除缺失数据(pd.dropna()方法)
  19. 详细介绍redis的集群功能,带你了解真正意义上的分布式
  20. C#版查杀本地/远程进程工具

热门文章

  1. JavaScript实现生成指定范围随机数和一个包含不重复数的随机数组
  2. Flutter-SearchDelegate搜索框
  3. CSS--使用CSS Grid(网格)布局
  4. python tkinter坐标转换
  5. 共享OrCAD9.2pSpice9.2+multisim下载地址
  6. element中的表格处理:循环出表格数据
  7. 英语单词character
  8. CollectionUtils工具类中常用方法
  9. 吐血整理 | 1000行MySQL学习笔记,不怕你不会,就怕你不学!
  10. 演示Git使用