事件驱动和异步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. Python从MongoDB中按天读取数据并格式化日志

    #$cat SpeechMongoHandle.py from pymongo import Connection import time import datetime # CTRL_A='\x01 ...

  2. AMQP学习 & RabbitMQ 与 ActiveMQ、ZeroMQ以及Kafka的比较

    之前写了一篇文章关于Active以及消息队列推拉模式的文章,可以参考:link 关于 Active 与 RabbitMQ以及其他的比较,有如下记录: 这篇文章 link 提到: 基本介绍RabbitM ...

  3. loadrunner11 测试restful

    loadrunner不知道为啥会有这么大的体积. 一开始用的是c脚本,可是恶心的是又不是完全的c,读文件的fseek居然没有. 后来又折腾java脚本,发现loadrunner11 java要用jdk ...

  4. fullcalendar案例一<原>

    fullcalendar是个很强大的日历控件,可以用它进行排班.排会议.拍任务,很直观,用户体验良好. 看下效果图: #parse("index/head.vm") <lin ...

  5. apt-get install 的替换命令及mysql安装问题的解决

    Some packages could not be installed. This may mean that you haverequested an impossible situation o ...

  6. mac os x10.9.2 查看进程对应端口

    以前在Ubuntu上,直接sudo netstat -nap 但是在mac 上这个命令还跑不通,sudo netstat  -nap  tcp 才行,结果还没有进程号.用lsof -Pn 解决了

  7. DALFactory有什么作用

    DAL是指Data Access Layer.DALFactory是用于创建数据訪问对象的工厂.本质上是採用了抽象工厂的设计模式.目的是支持多种数据訪问层,比方sql server和oracle两种实 ...

  8. ORACLE11G 字符集更改(这里更改为AL32UTF8)

    ORACLE11G 字符集更改(这里更改为AL32UTF8)更改步骤:1.用sysdba角色用户登录sqlplus: 命令行输入:sqlplus sys as sysdba 2.输入口令,进入sqlp ...

  9. 关于c# 发射的调用并进行缓存

    private static object CreateObject(string AssemblyPath, string classNamespace) { object objObject = ...

  10. Understand:高效代码静态分析神器详解(一)

    Understand:高效代码静态分析神器详解(一) Understand   之前用Windows系统,一直用source insight查看代码非常方便,但是年前换到mac下面,虽说很多东西都方便 ...