.net httpwebrequest 并发慢_go语言并发之MPG模型

请记住go并发的真理:Do not communicate by sharing memory; instead, share memory by communicating.
不要以共享内存的方式来通信,相反,要通过通信来共享内存。

go语言天生的并发大家都知道,可是go是如何实现轻松的构造上万的协程呢?今天我们就说一下go并发的MPG模型。

后续会有更多的模式和算法以及区块链相关的,如果你是想学习go语言或者是对设计模式或者算法感兴趣亦或是区块链开发工作者,都可以关注一下。(微信公众号:Go语言之美,更多go语言知识信息等)。公众号会持续为大家分享更多干货。
  1. M 代表着一个内核线程,也可以称为一个工作线程。goroutine就是跑在M之上的
  2. P 代表着(Processor)处理器 它的主要用途就是用来执行goroutine的,一个P代表执行一个Go代码片段的基础(可以理解为上下文环境),所以它也维护了一个可运行的goroutine队列,和自由的goroutine队列,里面存储了所有需要它来执行的goroutine。
  3. G 代表着goroutine 实际的数据结构(就是你封装的那个方法),并维护者goroutine 需要的栈、程序计数器以及它所在的M等信息。
  4. Seched 代表着一个调度器 它维护有存储空闲的M队列和空闲的P队列,可运行的G队列,自由的G队列以及调度器的一些状态信息等。

3526f8adcf17157ca7b30bc947ca781a.png

多个goroutine并发合作

上面这个图生动的说明多个协程工作形式,其中每一个gopher(土拨鼠)可以看作一个协程(G),其实对于这些gopher,还有一个包工头的gopher,他来管理这些工作的gopher,这个包工头就可以看作一个 Seched。

4e113fc6e1d0351acfa48714a2d35108.png

MPG

我们在看上面这个图,图中P正在执行的Goroutine为蓝色的,处于待执行状态的Goroutine为灰色的,灰色的Goroutine形成了一个队列runqueues。

我们再看一下三者的宏观图:

5b108de18f94d84fa77fe9244ee6a170.png

MPG宏观图

在这里,当一个P关联多个G时,就会处理G的执行顺序,就是并发,当一个P在执行一个协程工作时,其他的会在等待,当正在执行的协程遇到阻塞情况,例如IO操作等,go的处理器就会去执行其他的协程,因为对于类似IO的操作,处理器不知道你需要多久才能执行结束,所以他不回去等你执行完。

上面我们看着go的并发好像是抢占式的,事实上go的协程是非抢占式的,由协程主动交出控制权,也就是说,上面在发生IO操作时,并不是调度器强制切换执行其他的协程,而是当前协程交出了控制权,调度器才去执行其他协程。我们列举一下goroutine可能切换的点:

  • I/O,select
  • channel
  • 等待锁
  • runtime.Gosched()

这些点是go协程可能切换的地方,但是并不是一定切换的。

正是因为是非抢占式的,所以才轻松的构造上万的协程,如果是抢占式,那么就会在切换任务时,保存当前的上下文环境,因为当前线程如果正在做一件事,做到一半,我们就强制停止,这时我们就必须多保存很多信息,避免再次切换回来时任务出错。

线程是操作系统层面的多任务,而go的协程属于编译器层面的多任务,go有自己的调度器来调度。一个协程在哪个线程上是不确定的,这个是由调度器来决定的,多个协程可能在一个或多个线程上运行。

go的并发是很重要的,这里只是简单说一下MPG模型的个人理解,如果大家有不同意见,可以一起讨论学习,三人行必有我师。如果觉得这篇文章不错可以转发(微信公众号/今日头条:Go语言之美,更多go语言知识信息等)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中os操作文件及文件路径

python中os操作文件及文件路径实例汇总 1 . python获取文件上一级目录:取文件所在目录的上一级目录 os.path.abspath(os.path.join(os.path.dirname(settings.py),os.path.pardir)) 2. os.path.pardir是父目录,os.path.abspath是绝对路径 printos.path.…

JVM内存管理(一)--GC简介

GC策略解决了哪些问题? 既然是要进行自动GC,那必然会有相应的策略,而这些策略解决了哪些问题呢,粗略的来说,主要有以下几点。 1、哪些对象可以被回收。 2、何时回收这些对象。 3、采用什么样的方式回收。 GC策略采用何…

java 自定义注释_带有自定义注释的Java注释教程

java 自定义注释Java批注提供有关代码的信息,并且它们对其批注的代码没有直接影响。 在本教程中,我们将学习Java注释,如何编写自定义注释 ,注释用法以及如何使用反射来解析注释 。 注释是在Java 1.5中引入的,现在它已…

vue标准时间改为时间戳_正确的济南初中寒假放假时间安排出来啦!家长速戳→...

原标题:正确的济南初中寒假放假时间安排出来啦!家长速戳→今年济南初中寒假放假时间↓↓↓ 2021年1月30日-2月26日第一学期1 寒假安排义务教育阶段学校寒假开始时间为2021年1月30日(腊月十八),寒假结束时间为2月26日(正月十五)。高中阶段学校…

给深度学习入门者的Python快速教程 - 基础篇

Python快速教程 - 基础篇 5.1 Python简介 本章将介绍Python的最基本语法,以及一些和深度学习还有计算机视觉最相关的基本使用。 5.1.1 Python简史 Python是一门解释型的高级编程语言,特点是简单明确。Python作者是荷兰人Guido van Rossum&#xff0c…

模糊理论在机器人传感器中的应用_智能家电中的传感器应用大全

面对智能化家庭网络的逐渐普及和发展,各种各样的传感器引入到家电中变得更加迫切。人们希望家电能增加使用的舒适度、减少耗能和耗水、清洗方便、降低噪声和振动、提高使用质量、实现复杂的智能。以前传感器主要应用于温度控制和水平控制系统, 现在它们的…

用Java解析:您可以使用的所有工具和库

如果需要从Java解析语言或文档,则从根本上讲有三种方法可以解决问题: 使用支持该特定语言的现有库:例如用于解析XML的库 手动构建自己的自定义解析器 生成解析器的工具或库:例如ANTLR,可用于构建任何语言的解析器 …

一台服务器装两个sql server 如何访问吗_服务器多网卡多路由策略

场景背景与需求某公司新买一台服务器, 服务器资源(cpu,内存,硬盘)比较多,并且有多个网卡。运维工程师为了节省资源,在服务器上搭建多个服务,希望通过多个网卡实现流量分流。但由于运维工程师对网络理解不够深入,将服务器的多个网卡都配置了同…

python seed()

Python seed() 函数 seed() 方法改变随机数生成器的种子,可以在调用其他随机模块函数之前调用此函数。 以下是 seed() 方法的语法: import random random.seed ( [x] )注意:seed(()是不能直接访问的,需要导入 …

vue 路由知识点梳理及应用场景整理

最近做项目才发现,我确实对 vue-router 太不熟悉了,都只了解个简单用法就开始搞了,本来很简单的问题,都搞不清楚。现在重新看一遍文档,重新梳理一下。 vue 路由的原理 说实话,路由我一直也就光顾着用&#…

dct变换的主要优点有哪些_发泡保温材料包括哪些成分?主要优点是什么?有没有发展前景?...

在各个行业中,对发泡保温材料都有需求。随着这种材料越来越受欢迎,更多人开始关注它的成分与优点。了解的越多,越容易在合适的场合令其发挥功效。组成成分有哪些?对于发泡保温材料来说,包括甲组和乙组两部分。所谓的甲…

企业集成模式_企业集成模式简介

企业集成模式在此博客文章中,我们将介绍一些企业集成模式。 这些是旨在解决集成挑战的已知设计模式。 阅读此书后,您将可以设计集成解决方案。 EIP(简而言之)是已知的设计模式,可为应用程序集成过程中面临的问题/问题…

win7安装

以Dell电脑为例,其他品牌电脑类似 Dell安装win7 一:快捷启动U盘或光盘的方法: 1, 打开戴尔Dell电脑,当进入到标志画面时,马上按键盘上方的F12键,就能进入到快捷启动菜单。 2, 进…

【Bootstrap】 框架 栅格布局系统设计原理

前提条件(Bootstrap 自带) 首先使用这个布局之前要定义一下代码: 这行代码如果不懂,可以搜索一下,总之大致意思就是,被定义的元素的内边距和边框不再会增加它的宽度,不加入的话排版会有问题。 不…

asp.net接受表单验证格式后再提交数据_药物临床试验数据管理与统计分析的计划和报告指导原则...

来源:国家药监局网站一、前言规范的数据管理计划有助于获得真实、准确、完整和可靠的高质量数据;而详细的统计分析计划则有助于保证统计分析结论正确和令人信服。为保证临床试验数据的质量和科学评价药物的有效性与安全性,必须事先对数据管理…

使用Spring Boot应用程序将代码管道化

这是有关基于本地Docker compose堆栈的持续交付的一系列帖子中的最后一篇(请参阅此处的第一篇和第二篇文章 )。 在这篇文章中,我使用一个简单的Spring Boot项目来展示如何利用“ 管道作为代码 ”的概念。 请注意,这仅是示例&#…

matlab function的使用

首先创建一个m文件; Matlab函数定义格式,用关键字function定义函数 function [输出变量] 函数名称(输入变量) % 注释 % 函数体 简单的函数如下: function [a,b,c]test(d,e,f) ade; bef; cfd; end 函数的调用: …

关键词热度分析工具_阿里国际站外贸独立站关键词的收集

很多朋友在做外贸独立站SEO和阿里巴巴国际站的时候,一定要查找收集一定数量的关键词,并且按照关键词的热度和词品相关性进行分类,从而为后面阿里巴巴国际站发布产品或者独立站谷歌推广打下坚实的基础。所谓磨刀不误砍柴工,好的关键…

matlab区分卷积和相关

区分卷积和相关 图像处理中常常需要用一个滤波器做空间滤波操作。空间滤波操作有时候也被叫做卷积滤波,或者干脆叫卷积(离散的卷积,不是微积分里连续的卷积);滤波器也有很多名字:卷积模版、卷积核、掩模、…

2345电脑管家_2345软件管家下载|2345软件管家 2.0 官方正式版

对于很多类似的软件而言,这一款软件在互联网行业也不算无名之辈,毕竟你都搜索到这里,也是认可了这款软件的地位和作用。而且看最新的版本迭代,也有一些比较欣喜的变化,是以前版本所没有的。2345软件管家功能介绍 新一代…