1、介绍协程前先需要了解进程和线程

进程:程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。
线程:进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
进程和线程的关系:一个进程可以创建和撤销多个线程;同一个进程中的多个线程之间可以并发执行。

2、介绍协程

协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的。
线程和协程的关系:一个线程上可以跑多个协程,协程是轻量级的线程。

3、介绍goroutine

本质上,goroutine就是协程。不同的是,Golang在runtime、系统调用等多方面对goroutine调度进行了封装和处理。
Go语言编程中你不需要去自己写进程、线程、协程,你的技能包里只有一个技能goroutine。当你需要让某个任务并发执行的时候,你只需要把这个任务包装成一个函数,开启一个goroutine去执行这个函数。

4、使用goroutine

Go语言中使用goroutine非常简单,只需要在调用函数的时候在前面加上go关键字,就可以为一个函数创建一个goroutine。例如:

func hello() {fmt.Println("Hello Goroutine!")
}
func main() {go hello() // 启动另外一个goroutine去执行hello函数fmt.Println("main goroutine done!")time.Sleep(time.Second)
}

执行会先打印main goroutine done!,然后紧接着打印Hello Goroutine!。因为我们在创建新的goroutine的时候需要花费一些时间,而此时main函数所在的goroutine是继续执行的。

参考文章:http://www.topgoer.com/

golang协程介绍和理解相关推荐

  1. C++ 协程介绍[译]

    此文翻译自:COROUTINES INTRODUCTION 在很长时间的争论,反对和准备后,WG21(ISO C++ Committee) 统一了在C++20中coroutines (协程)的具体实现 ...

  2. golang 协程同步 简介

    目录 协程概念简要理解 为什么要做同步 协程的几种同步方法 Mutex channel WaitGroup 协程概念简要理解 协程类似线程,是一种更为轻量级的调度单位,但协程还是不同于线程的,线程是系 ...

  3. Python与Golang协程异同

    背景知识 这里先给出一些常用的知识点简要说明,以便理解后面的文章内容. 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定 ...

  4. 深入浅出 Golang 协程池设计

    使用Go语言实现并发的协程调度池阉割版,本文主要介绍协程池的基本设计思路,目的为深入浅出快速了解协程池工作原理,与真实的企业协程池还有很大差距,本文仅供学习参考. 一.何为并发,Go又是如何实现并发? ...

  5. Unity3D协程介绍 以及 使用

    作者ChevyRay ,2013年9月28日,snaker7译  原文地址:http://unitypatterns.com/introduction-to-coroutines/ 在Unity中,协 ...

  6. golang 数组 最后一个_面试必问:Golang高阶Golang协程实现原理

    1 01 引言 实现并发编程有进程,线程,IO多路复用的方式.(并发和并行我们这里不区分,如果CPU是多核的,可能在多个核同时进行,我们叫并行,如果是单核,需要排队切换,我们叫并发). 1.1 进程和 ...

  7. go 怎么等待所有的协程完成_怎么关闭golang协程

    怎么关闭golang协程 发布时间:2020-06-10 10:43:33 来源:亿速云 阅读:284 作者:Leah 这篇文章给大家分享的是关闭golang协程的方法.小编觉得挺实用的,因此分享给大 ...

  8. Golang 协程的使用方法

    Golang 协程正确的使用方法 错误的使用方法 package main // 错误使用案例 import ("time""fmt" ) var c1 cha ...

  9. Golang 协程顺序打印

    Golang 协程顺序打印 A.B 两个协程分别打印 1.2.3.4 和 A,B,C,D 实现:定义 A.B 两个 channal,开 A.B 两个协程,A 协程输出[1, 2, 3, 4].B 协程 ...

最新文章

  1. UML之交互图(协作图和顺序图)
  2. UA MATH567 高维统计专题2 Low-rank矩阵及其估计1 Matrix Completion简介
  3. ABAP中P类型介绍
  4. ExtJs UI框架学习三
  5. postfix导致maillog填满磁盘空间的巨坑!
  6. weblogic12.1.3安装
  7. Spring集成JavaMail并利用线程池发送邮件
  8. python中的字典及注意事项
  9. 系统架构师学习笔记-多媒体基础知识
  10. 基于Givens变换的QR分解
  11. 利用Apperance协议定义View的全局外观
  12. 常见的C++关键字有哪些?
  13. 全网首发:gstreamer如何接入RTSP流(IP摄像头)的代码范例
  14. Oracle database 11g release2发布
  15. ASP.Net之发展史
  16. Android 请求Root权限代码
  17. Unity的ScrollRect如何裁切粒子特效,以及如何使粒子特效显示在UI上
  18. wlan网页登录认证原理
  19. 修炼魅力女人“诱惑”术
  20. WordPress博客主题 大前端DUX6.1主题绿色版

热门文章

  1. java 脚本引擎性能_Java SE 6 入门之脚本引擎加大程序性能
  2. mysql安全性实验心得_mysql安全小结
  3. Python基础教程:pd.drop_duplicates删除重复行的方法
  4. Python中必备知识点:对字符编码的基本操作
  5. Python判断字符串是否为字母或者数字
  6. python两种生成md5的方法
  7. python中的try...except...finally函数
  8. python **运算符及多参数传参
  9. urllib库添加headers的一般方法
  10. 新手怎么读懂一个中型的Django项目