事件驱动模型

传统编程线性模型

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

每个代码块都有各自实现的功能,按照条件语句顺序判断执行,每一次运行顺序或许都不同,它的控制流程是由获取的数据所和判断语句所决定的。

事件驱动程序模型

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

事件驱动器启动后,在等待事件触发,然后做出相应的程序执行效果。触发事件包括:输入信息、鼠标、敲击键盘、内部定时器等

IO模型

synchronous 同步IO

一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行

所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回。按照这个定义,

其实绝大多数函数都是同步调用。但是一般而言,我们在说同步、异步的时候,

特指那些需要其他部件协作或者需要一定时间完成的任务。

asynchronous 异步IO

当一个异步功能调用发出后,调用者不能立刻得到结果

当该异步功能完成后,通过状态、通知或回调来通知调用者。如果异步功能用状态来通知,

那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一 种很严重的错误)。

如果是使用通知的方式,效率则很高,因为异步功能几乎不需要做额外的操作。至于回调函数,其实和通知没太多区别。

blocking 阻塞IO

调用结果返回之前,当前线程会被挂起

函数只有在得到结果之后才会

将阻塞的线程激活。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。

non-blocking 非阻塞IO

和阻塞IO对立

在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程

触发方式

水平触发

只有高电平(1)或低电平(0)的时候才触发通知,只要在这两种状态就能得到通知,只要有数据可读,那么水平触发的epoll就立即返回

边缘触发

只有电平发生变化(高电平到低电平,或者低电平到高电平)的时候才触发通知,有数据可读,但没有新的IO活动到来,epoll不会立即返回

multiplexing IO多路复用

select优缺点对比

select:轮询方式,遍历每个监听对象是否有数据变动,效率较低

epoll:主动响应,主动提交数据变动提升效率

select模块水平触发实现并发IO多路复用

服务端

# -*- coding:utf8 -*-

import socket,select

test = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#定义socket通信方式和通信协议。socket.AF_INET基于网络通信,socket.SOCK_STREAM基于TCP协议

test.bind(('127.0.0.1',8000)) # 定义通信ID

test.listen(5) # 定义最大通信监听数

inputs = [test,] #定义监听socket对象的列表

while True:

r,w,e = select.select(inputs,[],[],5) # select监听 socket 对象,后跟时间单位为秒

for obj in r: # 遍历监听对象列表

if obj == test: # 判断监听对象是否和上次遍历一样

conn,addr = obj.accept() # 被动接收套接字建立的连接

print('accepted',conn,'from',addr)

inputs.append(conn) # 添加新socket对象到列表

else:

msg = obj.recv(1024) # 定义接收字节信息

print('客户端发送的消息是:', msg)

obj.send(msg.upper()) # 定义发送消息

print("服务监听中...")

服务监听中...

客户端发送的消息是: b'abc'

服务监听中...

客户端发送的消息是: b'aaa'

服务监听中...

客户端

# -*- coding:utf8 -*-

import socket

test = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#定义socket通信方式和通信协议。socket.AF_INET基于网络通信,socket.SOCK_STREAM基于TCP协议

test.connect(('127.0.0.1',8000)) #定义通信ID,服务器的地址和端口

while True:

inp = input(">>>").strip() #用户输入发送内容

test.sendall(inp.encode('utf-8')) #定义发送内容

data = test.recv(1024) #定义接收字节信息

print('收到服务端的发来的消息是:',data)

>>>abc

收到服务端的发来的消息是: b'ABC'

>>>aaa

收到服务端的发来的消息是: b'AAA'

>>>

selectors模块实现并发IO多路复用

服务端

#-*- coding:utf-8 -*-

import selectors,socket

sel = selectors.DefaultSelector() # 操作系统自识别合适的IO多路复用方式

def accept(sock,mask):

conn,addr = sock.accept() # 被动接收套接字建立的连接

conn.setblocking(False) # 设置非阻塞

sel.register(conn,selectors.EVENT_READ,read) # conn 和 read 绑定,socket对象有活动调用accept方法

def read(conn,mask):

try: # 异常代码检测防止某个客户端断开连接导致服务终止

data = conn.recv(1024) # 接收数据

if not data: # 判断是否接收到数据

raise Exception

conn.send(data.upper()) # 接收到数据并返回数据

except Exception as e: # 万能异常

sel.unregister(conn) # 没有接收到数据,解除conn绑定的函数

conn.close() # 关闭连接

sock = socket.socket() # 创建socket对象

sock.bind(('127.0.0.1',8000)) # 定义通信ID绑定对象

sock.listen(100) # 定义最大通信监听数

sock.setblocking(False) # 设置非阻塞

sel.register(sock,selectors.EVENT_READ,accept) # socket 和 accept 绑定,socket对象有活动调用accept方法

print("服务运行中....")

while True:

events = sel.select() # 监听socket对象

for key,mask in events: # 遍历events对象列表

callback = key.data # 触发socket绑定的函数accept

callback(key.fileobj,mask) # 监听到的有相应的socket对象

服务运行中....

客户端

# -*- coding:utf8 -*-

import socket

test = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#定义socket通信方式和通信协议。socket.AF_INET基于网络通信,socket.SOCK_STREAM基于TCP协议

test.connect(('127.0.0.1',8000)) #定义通信ID,服务器的地址和端口

while True:

inp = input(">>>").strip() #用户输入发送内容

test.sendall(inp.encode('utf-8')) #定义发送内容

data = test.recv(1024) #定义接收字节信息

print('收到服务端的发来的消息是:',data)

>>>abc

收到服务端的发来的消息是: b'ABC'

>>>

python事件触发机制_Python3-事件驱动、IO模型和触发方式相关推荐

  1. python事件触发机制_python模拟事件触发机制详解

    本文实例为大家分享了python模拟事件触发机制的具体代码,供大家参考,具体内容如下 EventManager.py # -*- encoding: UTF-8 -*- # 系统模块 from que ...

  2. python制作界面怎么触发事件_python模拟事件触发机制详解

    本文实例为大家分享了python模拟事件触发机制的具体代码,供大家参考,具体内容如下 EventManager.py # -*- encoding: UTF-8 -*- # 系统模块 from que ...

  3. 事件触发控制_基于事件触发机制的直流微电网多混合储能系统分层协调控制方法...

    点击下面标题,了解通知详情第九届电工技术前沿问题学术论坛征文通知 华北电力大学电气与电子工程学院的研究人员郭伟.赵洪山,在2020年第5期<电工技术学报>上撰文,以含有多个混合储能系统(H ...

  4. htmljavascript 事件触发机制

    html 事件触发机制 <!DOCTYPE html> <html> <head><meta charset="UTF-8">< ...

  5. ANDROID事件触发机制

    本文来自:安卓航班网 ANDROID事件触发机制 首先,这篇文章仅仅针对于由于触摸(Touch)而触发的事件. Android的事件:onClick, onScroll, onFling等等,都是由许 ...

  6. Winform3、事件触发机制学习:事件的注册和定义和参数含义

    Winform3.事件触发机制学习:事件的注册和定义 在一个Form窗体中拖个按钮,双击后系统自动生成代码: // 定义事件,一般在Form.cs文件 // 默认事件是有命名规范的,控件命_事件名_个 ...

  7. python 模拟io_Python 的五种io模型理解

    一 IO操作本质 数据复制的过程中不会消耗CPU 1 2 3 #1 内存分为内核缓冲区和用户缓冲区 # 2 用户的应用程序不能直接操作内核缓冲区,需要将数据从内核拷贝到用户才能使用 # 3 而IO操作 ...

  8. Mina IoHandler 事件触发机制

    原文地址:Mina IoHandler(Apache Mina user guide Chapter8 Handler) 所有处理I / O事件都由Mina触发.接口所有活动中心的完成,都在过滤器链结 ...

  9. JS:关于事件触发机制

    事件触发经历三个阶段 捕获阶段->目标阶段->冒泡阶段 事件捕获:从外层一层一层往内部直至传递到目标元素: 事件冒泡:从目标元素开始一层层向外传递至根节点: DOM事件流,是先调用捕获阶段 ...

最新文章

  1. python for-Python for windows官方版
  2. java8 stream遍历_Java8新特性:Stream流详解
  3. 好看的按钮组件_一个能决定命运的按钮,你敢来挑战吗?
  4. 织梦自定义图片字段和缩略图一样_DedeCMS系统自定义字段的图片调用
  5. 小到年货大到产业,刘村长的扶贫模式有点厉害!
  6. 智能记忆功能nest_如何设置和安装Nest Protect智能烟雾报警器
  7. 慕学在线网0.4_xadmin后台管理
  8. Android木马分析实验,Android木马简介与分析
  9. expires为session_面试必问:session,cookie和token的区别
  10. Bailian4138 POJ NOI MATH-7827 质数的和与积【数论】
  11. java定义json数组_java json序列化自定义类,类数组
  12. Hownet在NLP领域内是什么样的地位?
  13. 小米cc9出厂线刷包_小米CC9手机忘记密码一键刷机解锁 | 线刷宝刷机工具刷机包下载...
  14. vs2015 使用Qt语言家及其使用过程中遇到的问题
  15. 区块链百科合集之 账 户 体 系
  16. android字体右对齐,Android TextView将文本右对齐和左对齐
  17. 谷歌浏览器打开特殊端口号地址方法
  18. matlab计算纹波电压,如何估算开关电源纹波电压?
  19. Transforemr模型从零搭建Pytorch逐行实现
  20. win10中安装JDK8以及环境配置

热门文章

  1. 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点
  2. 移动前端开发基础与优化
  3. 【ZZ】字符编码笔记:ASCII,Unicode和UTF-8
  4. c# winform窗口自适应各种分辨率类
  5. wp7 给TextBox设置圆角边框
  6. 关掉linux下的讨厌的beep声
  7. 算法与数据结构(一)
  8. wordpress 介绍
  9. openjdk-alpine镜像字体问题
  10. vuejs单文件组件:安装 webpack 和 vue-cli