Python 异步IO、IO多路复用

事件驱动模型

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6
 7 </head>
 8 <body>
 9
10 <p onclick="fun()">点我呀</p>
11
12
13 <script type="text/javascript">
14     function fun() {
15           alert(‘约吗?‘)
16     }
17 </script>
18 </body>
19
20 </html>
21
22 事件驱动之鼠标点击事件注册

事件驱动鼠标事件

传统的编程是如下线性模式的:

开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结束

每一个代码块里是完成各种各样事情的代码,但编程者知道代码块A,B,C,D...的执行顺序,唯一能够改变这个流程的是数据。输入不同的数据,根据条件语句判断,流程或许就改为A--->C--->E...--->结束。每一次程序运行顺序或许都不同,但它的控制流程是由输入数据和你编写的程序决定的。如果你知道这个程序当前的运行状态(包括输入数据和程序本身),那你就知道接下来甚至一直到结束它的运行流程。

对于事件驱动型程序模型,它的流程大致如下:

开始--->初始化--->等待

与上面传统编程模式不同,事件驱动程序在启动之后,就在那等待,等待什么呢?等待被事件触发。传统编程下也有“等待”的时候,比如在代码块D中,你定义了一个input(),需要用户输入数据。但这与下面的等待不同,传统编程的“等待”,比如input(),你作为程序编写者是知道或者强制用户输入某个东西的,或许是数字,或许是文件名称,如果用户输入错误,你还需要提醒他,并请他重新输入。事件驱动程序的等待则是完全不知道,也不强制用户输入或者干什么。只要某一事件发生,那程序就会做出相应的“反应”。这些事件包括:输入信息、鼠标、敲击键盘上某个键还有系统内部定时器触发。

目前大部分的UI编程都是事件驱动模型,如很多UI平台都会提供onClick()事件,这个事件就代表鼠标按下事件。事件驱动模型大体思路如下:

  1. 有一个事件(消息)队列;
  2. 鼠标按下时,往这个队列中增加一个点击事件(消息);
  3. 有个循环,不断从队列取出事件,根据不同的事件,调用不同的函数,如onClick()、onKeyDown()等;
  4. 事件(消息)一般都各自保存各自的处理函数指针,这样,每个消息都有独立的处理函数;

事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定。它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理

让我们用例子来比较和对比一下单线程、多线程以及事件驱动编程模型。下图展示了随着时间的推移,这三种模式下程序所做的工作。这个程序有3个任务需要完成,每个任务都在等待I/O操作时阻塞自身。阻塞在I/O操作上所花费的时间已经用灰色框标示出来了。

四种IO模型

blocking IO (阻塞IO)

non-blocking IO(非阻塞IO)

IO multiplexing(IO多路复用)

Asynchronous I/O(异步IO)

时间: 2024-10-05 04:43:42

Python 异步IO、IO多路复用的相关文章

{python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) IO模型比较分析 selectors模块

阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 异步IO(Asynchronous I/O) 六 IO模型比较分析 七 selectors模块 一 IO模型介绍 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能

IO模型--阻塞IO,非阻塞IO,IO多路复用,异步IO

IO模型介绍: * blocking IO 阻塞IO * nonblocking IO 非阻塞IO * IO multiplexing IO多路复用 * signal driven IO 信号驱动IO () * asynchronous IO 异步IO IO模型介绍: 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,

Python异步IO --- 轻松管理10k+并发连接

前言 异步操作在计算机软硬件体系中是一个普遍概念,根源在于参与协作的各实体处理速度上有明显差异.软件开发中遇到的多数情况是CPU与IO的速度不匹配,所以异步IO存在于各种编程框架中,客户端比如浏览器,服务端比如node.js.本文主要分析Python异步IO. Python 3.4标准库有一个新模块asyncio,用来支持异步IO,不过目前API状态是provisional,意味着不保证向后兼容性,甚至可能从标准库中移除(可能性极低).如果关注PEP和Python-Dev会发现该模块酝酿了很长时

Python开发基础--- IO模型

IO模型分类 五种IO Model blocking IO 阻塞IO nonblocking IO 非阻塞IO IO multiplexing IO多路复用 signal driven IO 信号驱动IO asynchronous IO 异步IO signal driven IO(信号驱动IO)在实际中并不常用,所以只剩下四种IO Model. 网络IO的两个过程 对于一个network IO ,会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核

python基础之IO模型

IO模型分类 五种IO Model blocking IO 阻塞IO nonblocking IO 非阻塞IO IO multiplexing IO多路复用 signal driven IO 信号驱动IO asynchronous IO 异步IO signal driven IO(信号驱动IO)在实际中并不常用,所以只剩下四种IO Model. 网络IO的两个过程 对于一个network IO ,会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核

python并发编程&amp;IO模型

一 IO模型介绍 为了更好地了解IO模型,可先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别? 这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西. 这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同.所以,为了

5月2日 python学习总结 IO模型

IO模型 1.阻塞IO 2.非阻塞IO 3.多路复用IO 4.异步IO 一.阻塞IO blocking IO的特点就是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被block了. 实际上,除非特别指定,几乎所有的IO接口 ( 包括socket接口 ) 都是阻塞型的. 所谓阻塞型接口是指系统调用(一般是IO接口)不返回调用结果并让当前线程一直阻塞,只有当该系统调用获    得结果或者超时出错时才返回. 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大

【廖雪峰老师python教程】——IO编程

同步IO 异步IO 最常见的IO--读写文件 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件). open() read() close() try: f = open('/path/to/file', 'r') print(f.read()) finally

Linux 下网络 IO 的多路复用

2019-10-20 关键字:select 与 poll 在 Linux 系统下,IO 总共可以分为以下四种: 1.阻塞 IO: 2.非阻塞 IO: 3.IO多路复用: 允许同时对多个 IO 进行控制. 4.信号驱动 IO: 一种异步通信模型.前面三种 IO 都是同步型的,唯这一种是异步型的. 阻塞 IO 所谓阻塞 IO 就是在调用相关函数时,程序的运行指针会暂停往下执行,直至这个 IO 操作有结果返回为止.简单来说就是我发起一个 IO 操作请求,你有数据就返回给我,没数据我就等你到有数据为止.

使用C++ boost从零构建一个异步文件IO系统

前言 因为本科毕业设计中要做一个分布式文件系统,其中一个模块需要实现文件IO.为了验证我对异步IO的理解,决定造一个异步文件IO的轮子.操作系统已经给出各种异步操作的API,如重叠IO, IOCP,kqueue,select,poll,epoll等机制,而且C++也有很多跨平台的异步IO库,如libevent,boost::asio等.我参考已有的实现来完善这个小系统的功能. 渣技术,渣代码,出现问题请各位指出. 概述 同步与异步: 同步:假如我想对一个文件(socket也同理)进行处理,那么一