事件驱动和异步io有什么直接关系。

当我们访问一个网页,不考虑网络问题。我们人类不觉得网页慢。

但是实际中对计算机来说还是慢。那慢在哪里。io

io操作是整个网络操作中最慢的。比如你打开网页要是有2秒。cpu去请求页面也就是1毫秒,1999毫米都是io上消耗掉了。那么为什么会io 慢呢,因为内存要比硬盘快好几百倍。在等待io请求的时候,cpu为用户开启的线程在io操作的1999毫秒是阻塞在那里。

所以当多并发的时候,多个线程都在阻塞,CPU里同时存在的线程就多了,但是我们知道cpu同一时刻只能处理一个线程,当单cpu线程阻塞多了达到上百个或上千时就显得cpu特别忙。那么这种问题是需要解决的,怎么解决呢?就是利用异步io。select,poll,epoll这三种支持异步io的技术。操作系统内核中有一个io操作事件列表,操作系统内核高速循环这个列表,当处理完io后,调用一个回调函数,高速程序此io已经处理完成,你可以来取了。作为程序它在操作系统内核中注册的io事件后,就可以继续执行下面的操作了,不用等待这个io结束了,所以最终解决了cpu因为多io并发导致线程多,cpu压力大。但是,并没有提高用户访问网页的速度。

总结:

1.异步io(协程) 相对 多线程(非cpython的多线程)的优势是,解决了多线程时导致的cpu压力。

2.在cpython中,多线程会因为gil特性最终调用1个线程,所以不会因为多线程导致cpu压力大。但是这个特性也导致cpython中的多线程慢。

python2.0_s12_day9_协程&多线程和cpu,磁盘io之间的关系的更多相关文章

  1. python2.0_s12_day9_协程&Gevent协程

    Python之路,Day9 - 异步IO\数据库\队列\缓存 本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 协程 1.协程,又 ...

  2. 网络编程基础--协程--greenlet切换---gevent自动识别 IO ---

    协程: 1 单线程来实现并发---协程: 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程, 即协程是由用户程序自己控制调度的 只 ...

  3. 协程、gevent实现异步io、进程、线程、协程对比

    异步io的说白了就是遇到io操作的时候,就停下来去做别的事情.io分网络io和磁盘io,网络io比如说打开一个网站获取数据,下载一首歌等等,磁盘io就是把数据存到一个文件里面,写到磁盘上. 从网站上获 ...

  4. 协程,事件驱动,异步io模型,异步网络框架

    协程是一种用户态的轻量级线程,内核不知道它的存在.协程运行于一个线程中,协程的切换是由用户控制的.线程的切换是由cpu来控制的,而协程的切换是由用户控制的.协程的执行时串行的. select/poll ...

  5. 异步、+回调机制、线程queue、线程Event、协程、单线程实现遇到IO切换

    # from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor # import requests # import o ...

  6. 并发编程:协程TCP、非阻塞IO、多路复用、

    一.线程池实现阻塞IO 二.非阻塞IO模型 三.多路复用,降低CPU占用 四.模拟异步IO 一.线程池实现阻塞IO 线程阻塞IO 客户端 import socket c = socket.socket ...

  7. linux性能优化cpu 磁盘IO MEM

    系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上 ...

  8. swoole与php协程实现异步非阻塞IO开发

    “协程可以在遇到阻塞的时候中断主动让渡资源,调度程序选择其他的协程运行.从而实现非阻塞IO” 然而php是不支持原生协程的,遇到阻塞时如不交由异步进程来执行是没有任何意义的,代码还是同步执行的,如下所 ...

  9. java主线程结束和子线程结束之间的关系

    (一)Main线程是个非守护线程,不能设置成守护线程. 这是因为,main线程是由java虚拟机在启动的时候创建的.main方法开始执行的时候,主线程已经创建好并在运行了.对于运行中的线程,调用Thr ...

随机推荐

  1. GPIO实验(二)

    =============第三个实验============用c语言轮流点亮3个LED=================== 1.crt0.S.text.global _start_start:    ...

  2. Echarts的option中的data问题

    option = { title : { text: '某站点用户访问来源', subtext: '纯属虚构', x:'center' }, tooltip : { trigger: 'item', ...

  3. LeetCode: isSameTree1 解题报告

    isSameTree1 Given two binary trees, write a function to check if they are equal or not. Two binary t ...

  4. C语言 · 文本加密

    算法提高 9-2 文本加密   时间限制:1.0s   内存限制:256.0MB      问题描述 先编写函数EncryptChar,按照下述规则将给定的字符c转化(加密)为新的字符:"A ...

  5. mysql按年度、季度、月度、周、日统计查询的sql语句

    本文介绍一些mysql中用于查询的sql语句,包括按年度.季度.月度.周.日统计查询等,有需要的朋友,可以参考下. 一.年度查询 查询 本年度的数据   SELECT * FROM blog_arti ...

  6. java方法——重载2

    什么是Java方法重载 方法重载的定义 1 对于同一个类,如果这个类里面有两个或者多个重名的方法,但是方法的参数个数.类型.顺序至少有一个不一样,这时候局构成方法重载. END 方法重载示例 1 pu ...

  7. Bootstrap3.0 栅格系统背后的精妙魔法(Bootstrap3.0的栅格布局系统实现原理)

    这个标题取的有点奇怪,怪我翻译的有问题吧.英文学平有限,有道词典和google翻译齐上阵是必须的.还好翻译的不是小说,对于技术文章,还是能勉强翻过来的. 本文主要讲解了Bootstrap3.0的栅格布 ...

  8. NetBeans启动Tomcat报“'127.0.0.1' 不是内部或外部命令”启动失败的解决办法

    http://blog.sina.com.cn/s/blog_709548200102vgy4.html ——————————————————————————————————————————————— ...

  9. [Cxf] spring-cxf 配置

    1.在web.xml中配置servlet <!-- spring监听的配置 --> <listener> <listener-class>org.springfra ...

  10. [oracle] oracle的三种密码验证机制以及在windows和linux下的不同启动过程

    oracle数据库的密码验证机制: ① 操作系统验证 拥有SYSDBA和SYSOPER的用户用该方式验证此时数据库无需启动,也无需开启监听和实例服务. 要求:本地组ora_dba中有该操作系统的登录用 ...