来源:https://www.jianshu.com/p/62c0cd107da3

同步和异步、阻塞和非阻塞

首先要明确的是,同步(Synchronous)和异步(Asynchronous),阻塞(Blocking)和非阻塞(Non-Blocking)是两种完全不同的概念。前者指的是一种事件通知、处理机制,而后者则是程序控制流程的差异。

我们以A调用B为例来说明两者之间的区别:

  • 阻塞
    只有当B任务完成后,程序控制权才会返回给A, A得以继续执行。

  • 非阻塞
    B马上返回,此时B并没有完成,但A可以继续执行,B任务并不影响
    A的执行。

  • 同步
    A需要通过某种方式主动查询B是否完成。在blocking模式中,它表现为等待B返回;在non-blocking模式中表现为通过Future对象询问B是否完成,如果完成则取出结果,未完成则等待(阻塞)。

  • 异步
    A在启动B任务时就不管了,继续执行自己的任务,当B完成时,由操作系统主动通知A,告知B已经完成。A可以在适宜的时候取出B的执行结果。在这种模式下,A完全不会因为B的执行而影响自己。

异步是解决web应用高并发的唯一方案

“传统的”一线程对一请求的模型直接决定了单机并不能处理过多的并发请求,而且这种模型下会导致很大的线程资源浪费。这里面原因有二:一是每条线程占用要使用较多的内存,在JVM中每创建一个线程就要消耗2M多的heap,于是内存大小就变成线程数量的瓶颈;二是当线程数据超过CPU核心数时,频繁的线程切换会变成一笔可观的开销,而且当你的程序因为查询数据库、执行RPC调用阻塞当前线程时,这个线程是完全不能运行的,不仅白白占用了内存,还增加了Context Switch的次数。

异步并不能加快你对于单个请求的处理速度,但是它能最大化的消灭资源浪费,从而大大提高单机并发极限。

Go的世界中,万物皆异步

Go中只有协程,而协程本质上就是异步。

为什么这么说呢?首先我们知道,协程(routine)跟线程是多对一的关系,routine本身不会被调度执行,它只能依靠操作系统的线程来运行。一个线程可以执行多个routine, Go运行时调度器负责进行调度处理。routine只有三种情况需要让出执行权,分别是system call, 锁竞争和主动让出执行权力。

  • system call
    当发生系统调用时,执行当前routine的线程会block这是没得商量的,但go运行时会从它维护的线程池中取出一条空闲线程继续执行其它routine, 这样就做到了即使你block了routine,也不会影响其它routine的执行。这里可以类比于Netty中的I/O线程,如果你代码block了,则会卡住其他任务的执行,否则你必须在自己的线程池中执行会产生block的代码。

  • 网络I/O
    调用net包下的网络I/O操作是不会阻塞线程的。当发起网络I/O请求时,go运行时会通过操作系统提供的epoll机制注册I/O事件,不会挂起实际干活的线程,只会切换goroutine而已。

  • 竞争
    无论是锁竞争还是读写channel而导致routine被挂起,其背后的线程都是不会有任何block的,在OS看来线程一直在正常运行,从而大大降低了线程上下文切换的开销。

  • 主动让出执行权
    同上面的竞争,主动让出执行权时背后的线程同样不会block。

仔细想想看,这跟前面讲的异步不是几乎一样的逻辑吗?区别是,Go语言中是Go自己的调度器来通知routine等待的IO事件是否完成,而其它非协程语言则是OS来通知。

因此,Go中我们虽然在以同步的方式编写代码,但却与异步有着异曲同工之妙。

Go语言: 万物皆异步的更多相关文章

  1. 万物皆有始有终: Hawk5即日起停止升级迭代

    从即日起,Hawk将停止升级工作,其版本号将停留在5. https://github.com/ferventdesert/Hawk Hawk已经开发和维护6年时间了,它曾经承载了开发者很多的期待.背后 ...

  2. Javascript万物皆对象?

    在javascript的世界里,有这么一句话,万物皆对象. 但是这个对象,应该怎么理解呢? exm........??,难道值类型也是对象?!! 当然,不是. 准确地讲是对于“引用类型”而言. 那,在 ...

  3. 20190814 On Java8 第三章 万物皆对象

    第三章 万物皆对象 对象创建 数据存储 有5个不同的地方可以存储数据: 寄存器 (Registers) 最快的存储区域,位于CPU内部 .无法直接控制. 栈内存(Stack) 存在于常规内存 RAM ...

  4. C#实现一个万物皆可排序的队列

    需求 产品中需要向不同的客户推送数据,原来的实现是每条数据产生后就立即向客户推送数据,走的的是HTTP协议.因为每条数据都比较小,而数据生成的频次也比较高,这就会频繁的建立HTTP连接,而且每次HTT ...

  5. 万物皆可集成系列:低代码释放用友U8+深度价值(2)—数据拓展应用

    在上一篇内容我们介绍了如何利用低代码开发套件实现低代码应用与U8+系统的对接集成,本次给大家带来的是如何将用友U8+系统中的数据进行价值扩展和实际应用. 我们以生产物料齐套分析为例来说明如何利用低代码 ...

  6. javascript是脚本语言?javascript万物皆对象?

    呵呵哒!带你见识下js面对对象的魅力 是的是的,退后,朕要开始装逼了- 这是什么鸟东西?是的是的,装逼开始,2016年度最佳JS编译器,ES6标准出来后,小伙伴们对新特性摩拳擦掌,奈何浏览器支持把我们 ...

  7. 大话JS面向对象之开篇万物皆对象------(ATM取款机引发的深思)

    一,总体概要 OO(面向对象)概念的提出是软件开发工程发展的一次革命,多年来我们借助它使得很多大型应用程序得以顺利实现.如果您还没有掌握并使用OO进行程序设计和开发,那么您无疑还停留在软件开发的石器时 ...

  8. 万物皆对象的JavaScript

    写在前面: 经过前段时间对于H5语言的学习,开始慢慢适应现在的生活节奏和代码语言.从一开始的毫无头绪到现在可以大概地写出部分的网站静态页面,用了两个周的时间.作为一个之前从未接触过计算机语言的初学者来 ...

  9. Python赋值原理:Python无变量,万物皆对象

    有几个和以前的常见语言,比如c语言不同 改变变量数据不覆盖原来的 name = '苍老师' print(id(name)) name = '志玲' print(id(name)) 运行结果 73955 ...

随机推荐

  1. IntelliJ Idea 中文乱码问题

    首先,Idea真的是一款很方便的开发工具,但是关于中文乱码这个问题我不得不吐槽,这个编码也弄得这么麻烦干嘛呀...下面就说一下怎么解决中文乱码问题: 1.首先是编辑器的乱码,这个很好解决,file-& ...

  2. A股调整结束 很可能明天开始阶段性反弹 目标3100左右

    A股调整结束 很可能明天开始阶段性反弹 目标至少AC等距. A浪2685-3059=374 C浪2715+374=3089 长周期看 A股处于 2300-4300长期震荡中.A股的牛市还要等几年.

  3. sql 数据库操作语句 不带select

    MySQL数据操作语句 1.总纲 DDL -数据定义语句** create/drop/alter ** create: 创建 drop:删除 alter:修改 DML -数据操作语句 ** inser ...

  4. [POJ1190]生日蛋糕<DFS>

    题目链接:http://poj.org/problem?id=1190 题看上去确实很复杂 涉及到半径面积这些,其实看着真的很头疼 但是除去这些就是剪枝优化的dfs算法 #include<cst ...

  5. WEB缓存系统之varnish缓存项修剪

    前文我们聊了下varnish的状态引擎和不同类型的变量对应该使用在那个状态引擎中,以及每个状态引擎的对应处理事务:回顾请参考https://www.cnblogs.com/qiuhom-1874/p/ ...

  6. DAO,Service,Controler的简介

    DAO层: DAO层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表的增删改查,也就是说某个DAO一定是和数据库的某一张表一一对应的,其中封 ...

  7. Oracle数据库表和表列讲解

    如果将数据库比作一个存储东西的储物柜,表就像是储物柜上的各个抽屉,每个抽屉分门别类地存放了各种数据,在设计和规划数据库时,表的定义和规划往往相当重要,良好的表设计决定了程序人员编写程序的便利性与数据库 ...

  8. 用<center/>标签实现markdown 图片文字等内容居中显示

    markdown中,文字居中的方式是借助了html标签<center></center>的支持 示例 ![](https://img2018.cnblogs.com/blog/ ...

  9. fiddler设置重定向

    fiddler支持将指定模式的url映射到另一个指定的url,即可用于拦截某一请求,并重定向到本地的资源或其他服务器地址 fiddler常用于: 解析请求:如:解析http请求状态,请求头,请求正文, ...

  10. 1063 Set Similarity (25分)

    Given two sets of integers, the similarity of the sets is defined to be /, where N​c​​ is the number ...