优雅的并发编程范式,完善的并发支持,出色的并发性能是go语言区别于其他语言的一大特色.

  1.并发基础

  win和linux 出现之前,程序员并没有并发的概念.因为命令式程序设计语言是以串行为基础的,程序会顺序执行每条指令,整个过程只有一个上下文,即一个调用栈,一个堆.

  并发则意味着程序在运行时有多个执行上下文,对应着多个调用栈.每一个进程在运行时都有自己的调用栈和堆,有一个完整的上下文,而操作系统在调用进程的时候,会保存被调度进程的上下文,等该进程获得时间片后,再回复该进程的上下文到系统中.从操作系统层面来看,多进程是可以并发的.

  2.并发场景

  一方面我们需要灵敏响应的图形用户界面,一方面程序还需要执行大量的运算或IO密集操作,而我们需要界面响应与运算同时执行.

  当web服务器面对大量用户请求时,需要更多的web服务器工作单元来分别响应用户.

  事物处于分布式环境上,相同的工作单元在不同的计算机上处理着被分片的数据.

  计算机的CPU从单内核向多内核的发展,而我们的程序都是串行的.计算机硬件的能力没有得到发挥.

  程序因为IO操作被阻塞,整个程序处于停滞状态,其他IO无关的任务无法执行.

  3.并发优势

  并发能客观地表现问题模型

  并发可以充分利用CPU核心的优势,提高程序的执行效率

  并发能充分利用CPU与其他硬件设备固有的异步性

  4.并发主流实现模型

  多进程:是操作系统层面进行并发的基本模式,也是开销最大的模式.好处在于简单,进程间互不影响,坏处在于系统开销大,因为所有的进程都是由内核管理的.

  多线程:在大部分操作系统上都属于系统层面的并发模式,也是我们使用最多最有效的一种模式.它比多进程的开销小很多,但是其开销依旧很大,并且在高并发模式下,效率会有影响.

  基于回调的非阻塞/异步IO:这种架构源于多线程的危机.通过事件驱动的方式使用异步I/O,是服务器持续运转,且尽可能地少用线程,降低开销,在node.js中得到了很好的实践.但是这种模式编程比多线程还要复杂,因为它把流程做了分割,对于问题的反应不够自然.

  协程:本质上是一种用户态线程,不需要操作系统进行抢占式调度,且在真正的实现中寄存于线程中.因此系统开销极度小,可以有效的提高线程的任务并发性,而避免多线程的缺点,优点是需要语言的支持,如果不支持,则需要用户在程序中自行实现调度器,目前原生支持协程的语言还很少.

go 并发编程(1)的更多相关文章

  1. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  2. 伪共享(false sharing),并发编程无声的性能杀手

    在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor ...

  3. 【Java并发编程实战】----- AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...

  4. 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport

    在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...

  5. 【Java并发编程实战】----- AQS(二):获取锁、释放锁

    上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...

  6. 【Java并发编程实战】-----“J.U.C”:CLH队列锁

    在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列.他能够确保无饥饿,严格的先来先服务的公平性.下图是CLH队列节点的示意图: 在CLH队列的节点QN ...

  7. 【Java并发编程实战】-----“J.U.C”:Exchanger

    前面介绍了三个同步辅助类:CyclicBarrier.Barrier.Phaser,这篇博客介绍最后一个:Exchanger.JDK API是这样介绍的:可以在对中对元素进行配对和交换的线程的同步点. ...

  8. 【Java并发编程实战】-----“J.U.C”:CountDownlatch

    上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...

  9. 【Java并发编程实战】-----“J.U.C”:CyclicBarrier

    在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...

  10. 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock

    ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...

随机推荐

  1. codeblocks1712设置中文

    下载汉化包:百度网盘,密码:7rrz 下载后放到安装目录:D:\Program Files (x86)\CodeBlocks\share\CodeBlocks\locale\zh_CN(根据个人安装目 ...

  2. CF1139C Edgy Trees

    题目地址:CF1139C Edgy Trees 红黑树 \(ans\) 应该等于总数(\(n^k\))减去不含黑色边的序列数量 不含黑色边就意味着一个序列只能在一个红色联通块中 一个红色联通块中的序列 ...

  3. SQL Server Change Tracking

    1 概述 “更改跟踪”和“变更数据捕获”捕获和记录用户表的DML更改(插入.更新和删除操作),为某些有特殊需求的应用程序服务. 1.1 更改跟踪 更改跟踪捕获表的数据行更改这一行为,但不会捕获更改的具 ...

  4. SQL Server2016安装

    VS2017已经发布10多天了,这几天正好要重新做系统.所以想着把SQL Server和VS都做一次升级.VS2017只需要下载一个安装包就可以进行在线安装.但是SQL Server2016安装时会碰 ...

  5. 【原创】大数据基础之Spark(5)Shuffle实现原理及代码解析

    一 简介 Shuffle,简而言之,就是对数据进行重新分区,其中会涉及大量的网络io和磁盘io,为什么需要shuffle,以词频统计reduceByKey过程为例, serverA:partition ...

  6. css好看的银行卡号样式

    .cardNo { font-size: 17px; font-family: menlo,tahoma; text-shadow: 1px 1px 2px #666; line-height: 18 ...

  7. linux 安装telnet命令及使用

    一.CentOS下查看系统是否已安装telnetrpm -qa | grep telnettelnet-0.17-48.el6.x86_64telnet-server-0.17-48.el6.x86_ ...

  8. java 利用jsoup 爬取知乎首页问题

    今天学了下java的爬虫,首先要下载jsoup的包,然后导入,导入过程:首先右击工程:Build Path ->configure Build Path,再点击Add External JARS ...

  9. Penettation testing with the bush Shell

    1.  Network Reconnaissance first we can use the command to gather the site information by whois eg : ...

  10. 获取元素属性get_attribute

    获取text # coding:utf-8 from appium import webdriver from time import sleep desired_caps = { 'platform ...