您现在的位置是:首页 > 学习笔记 > Go语言Go语言
Go并发
冰山2019-02-14【Go语言】人已围观
简介1.并发
1.1并发概述
1.2进程并发
1.3线程并发
1.4协程并发
1.5Go并发
2.Goroutine
2.1Goroutine定义
2.2Goroutine的创建
2.3Goroutine特性
3.channel管道
3.1定义channel变量
3.2无缓冲的channel
3.3有缓冲的channel
3.4关闭channel
4.读写锁与互斥锁
4.1死锁
4.2互斥锁
4.3读写锁
1.并发
1.1并发概述
简而言之,所谓并发编程是指在一台处理器上“同时”处理多个任务。
随着硬件的发展、使用人数的快速增长,并发程序变得越来越重要。Web服务器会一次处理成千上万的请求。平板电脑和手机app在渲染用户画面同时还会后台执行各种计算任务和网络请求。即使是传统的批处理问题--读取数据,计算,写输出--现在也会用并发来隐藏掉I/O的操作延迟以充分利用现代计算机设备的多个核心,计算机的性能每年都在以非线性的速度增长。
宏观的并发是指在一段时间内,有多个程序在同时运行。
并发在微观上,是指在同一时刻只能有一条指令执行,但多个程序指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个程序快速交替的执行。
1.2进程并发
让我们先来思考一个问题,在使用进程实现并发时会出现什么问题呢?
1)系统开销比较大,占用资源比较多,开启进程数量比较少。
2)在unix/linux系统下,还会产生“孤儿进程”和“僵尸进程”。
在操作系统运行过程中,可以产生很多的进程。在unix/linux系统中,正常情况下,子进程是通过父进程fork创建的,子进程再创建新的进程。并且父进程永远无法预测子进程到底什么时候结束。 当一个进程完成它的工作终止之后,它的父进程需要调用系统调用取得子进程的终止状态。
孤儿进程
孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程领养孤儿进程。
僵尸进程
僵尸进程: 进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸(Zombie)进程。
Windows下的进程和Linux下的进程是不一样的,它比较懒惰,从来不执行任何东西,只是为线程提供执行环境。然后由线程负责执行包含在进程的地址空间中的代码。当创建一个进程的时候,操作系统会自动创建这个进程的第一个线程,成为主线程。
1.3线程并发
LWP:light weight process 轻量级的进程,本质仍是进程 (Linux下)
进程:独立地址空间,拥有PCB ,最小分配资源单位,可看成是只有一个线程的进程
线程:有独立的PCB,但没有独立的地址空间(共享),最小的执行单位
区别:在于是否共享地址空间。独居(进程);合租(线程)
Windows系统下,可以直接忽略进程的概念,只谈线程。因为线程是最小的执行单位,是被系统独立调度和分派的基本单位。而进程只是给线程提供执行环境。
1.4协程并发
协程:coroutine,也叫轻量级线程。与传统的系统级线程和进程相比,协程最大的优势在于“轻量级”。可以轻松创建上万个而不会导致系统资源衰竭。而线程和进程通常很难超过1万个。这也是协程别称“轻量级线程”的原因。
一个线程中可以有任意多个协程,但某一时刻只能有一个协程在运行,多个协程分享该线程分配到的计算机资源。
多数语言在语法层面并不直接支持协程,而是通过库的方式支持,但用库的方式支持的功能也并不完整,比如仅仅提供协程的创建、销毁与切换等能力。如果在这样的轻量级线程中调用一个同步 IO 操作,比如网络通信、本地文件读写,都会阻塞其他的并发执行轻量级线程,从而无法真正达到轻量级线程本身期望达到的目标。
在协程中,调用一个任务就像调用一个函数一样,消耗的系统资源最少!但能达到进程、线程并发相同的效果。在一次并发任务中,进程、线程、协程均可以实现。从系统资源消耗的角度出发来看,进程相当多,线程次之,协程最少。
1.5Go并发
Go 在语言级别支持协程,叫goroutine。Go 语言标准库提供的所有系统调用操作(包括所有同步IO操作),都会出让CPU给其他goroutine。这让轻量级线程的切换管理不依赖于系统的线程和进程,也不需要依赖于CPU的核心数量。
微信扫一扫~
支付宝扫一扫~
很赞哦! ()
上一篇:面向对象
下一篇:Golang之网络编程
相关文章
随机图文
Go语言TCP Socket通信编程(转)
一、模型 二、TCP连接的建立 三、Socket读写 四、Socket属性 五、关闭连接微服务(microservices)
1.什么是微服务? 2.微服务概念的由来? 3.微服务与微服务架构是一回事吗? 4.微服务架构和整体式架构的区别? 4.1整体式结构的特性 4.2微服务架构的特性 4.3微服务架构的缺点 5.为什么还要使用微服务架构Git常用基本用法
Git请求合并说明如今公司很多新项目都采取merge request方式来进行code review、非阻塞上线部署,因此掌握merge request很有必要,步骤如下: 1、现在本地用创建一个本地分支,git面向对象
1.匿名字段 1.1匿名字段创建与初始化 1.2同名字段 1.3指针类型匿名字段 2.方法 2.1基本方法创建 2.2给结构体添加方法 2.3指针变量的方法值 2.4方法继承 2.5方法重写 3.接口 3.1接口实现 3.2多态 3.3接口实例 3.4接口继承与转换 3.5空接口