参考文章地址:http://www.cnblogs.com/yuanchenqi/articles/5722574.html

两个步骤:

recvfrom 系统调用 ; 拷贝数据 从kernel到数据

  1. 阻塞IO:在IO执行两个阶段进程都被阻塞(1. kernel 准备数据,等待数据到来  2. kernel 将数据拷贝到用户态)
  2. 非阻塞IO:第一步不阻塞,第二部拷贝数据阻塞(弊端:1. 多次询问 2. 数据不能及时同步)
  3. IO 多路复用(IO multiplexing):

又叫 ‘事件驱动IO’

select、epoll 的好处是单个 process 可以同时处理多个网络连接的IO。它的基本原理是select、epoll这个function会不断地轮询所有的socket,当某个socket有数据到达了,就通知用户进程。

select 是一个函数,进行数据监听。当调用这个函数时,他会发一个系统调用,监听数据是否到达。(进程会被阻塞,这个过程是 select 这个函数阻塞的)

当 select 告诉进程数据到达之后,进程需要多做一件事情,仍然要使用 recvfrom 进行 system call:告诉内核将数据拷贝到进程(此过程进程也会被阻塞)

好处:select 可以监听多个描述符,完成并发的效果。   跨平台

   4. 异步IO:

完全没有阻塞,用户进程发起read 操作之后,kernel如果还没有将数据准备好,会立即返回。这个时候进程可以去做其他的事情,当数据准备好并且kernel将数据拷贝到内存时,kernal会给进程发一个singal信号,告诉他read操作已经完成。

select、poll、epoll  IO多路复用:

epoll 真正解决了 select 的轮询问题,但它是同步IO

server:

# _author: lily
# _date: 2019/2/1 import socket
import time sk = socket.socket()
adress = ('127.0.0.1', 8080)
sk.bind(adress)
sk.listen(3)
sk.setblocking(False) while 1:
try:
conn, addr = sk.accept()
while 1:
data = conn.recv(1024)
print(data.decode('utf8'))
conn.sendall(data)
conn.close() except Exception as e:
print(' no data: ', e)
time.sleep(3)

client:

# _author: lily
# _date: 2019/2/1
import socket sk = socket.socket()
adress = ('127.0.0.1', 8080)
sk.connect(adress) while 1:
# inp = input('>>')
sk.sendall('hello'.encode('utf8'))
data = sk.recv(1024)
print(data.decode('utf8'))
sk.close()

28 Python初学(事件驱动模型)的更多相关文章

  1. 35.python之事件驱动模型

    转载:https://www.cnblogs.com/yuanchenqi/articles/5722574.html 事件驱动模型 上节的问题: 协程:遇到IO操作就切换. 但什么时候切回去呢?怎么 ...

  2. Python自动化之select、greenlet和gevent和事件驱动模型初探

    进程.线程和协程的区别 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度. 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的). 协程和线程一样 ...

  3. Python并发编程-事件驱动模型

     一.事件驱动模型介绍                                                                                         ...

  4. python网络编程--事件驱动模型

    论事件驱动与异步IO 事件驱动模型:根据事件的触发去干什么事,就是根据一个事件做反应 原文:http://www.cnblogs.com/alex3714/articles/5248247.html常 ...

  5. python学习之-- 事件驱动模型

    目前主流的网络驱动模型:事件驱动模型 事件驱动模型:也属于生产者/消费者结构,通过一个队列,保存生产者触发的事件,队列另一头是一个循环从队列里不断的提取事件.大致流程如下:1:首先生成一个事件消息队列 ...

  6. Day14 - Python基础14 事件驱动模型、IO模型

    本节内容: 1:事件驱动模型 2:IO模型前戏准备 3:4种IO模型 1:事件驱动模型 传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C---> ...

  7. python 浅析IO 模型

    协程:遇到IO操作就切换,但是什么时候切回去呢?怎么确定IO操作? 很多程序员可能会考虑使用"线程池"或"连接池"."线程池"旨在减少创建和 ...

  8. python学习----IO模型

    一.IO模型介绍 本文讨论的背景是Linux环境下的network IO. 本文最重要的参考文献是Richard Stevens的"UNIX® Network Programming Vol ...

  9. (六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 本章我们讨论一个除前面的单例 ...

随机推荐

  1. PHP全栈学习笔记10

    php常量,常量是不能被改变的,由英文字母,下划线,和数字组成,但是数字不能作为首字母出现. bool define ( string $name , mixed $value [, bool $ca ...

  2. Go基础(2)

    demo1: package main import ( "fmt" "strings" ) func main() { url := pathToUrl(&q ...

  3. python --- 基数排序算法

    基数排序的方式可以采用LSD,由键值的最右边开始,适用于数值整数.或者MSD,由键值的最左边开始,适用于字符串整数.在LSD基数排序中每一次的处理都是将关键字按顺序放置在其各自的称为桶的数据结构中,而 ...

  4. 从壹开始微服务 [ DDD ] 之八 ║剪不断理还乱的 值对象和Dto

    缘起 哈喽大家周四好,时间是过的真快,这几天一直忙着在公司的项目,然后带带新人,眼看这周要过去了,还是要抽出时间学习学习,这些天看到群里的小伙伴也都在忙着新学习,还是很开心的,至少当时的初衷已经达到了 ...

  5. Vue.js-04:第四章 - 页面元素样式的设定

    一.前言 前端开发中有三大件:HTML.CSS.JavaScript,在前面的学习中,不管是学习 Vue 的指令系统还是 Vue 的事件修饰符,主要还是针对的是我们在前端开发中的 JavaScript ...

  6. Android项目目录结构模板以及简单说明【简单版】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 开发Android项目的时候,一般都是一边开发一边根据需求创建目录(包.module),那么我呢就根据以往的项目经验,整理出一个比较 ...

  7. WindowUtils【窗口工具类】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 判断当前界面是横屏还是竖屏: 获取当前界面方向. 效果图   代码分析 isLandscape(Context context): ...

  8. JavaScript夯实基础系列(一):词法作用域

      作用域是一组规则,规定了引擎如何通过标识符名称来查询一个变量.作用域模型有两种:词法作用域和动态作用域.词法作用域是在编写时就已经确定的:通过阅读包含变量定义的数行源码就能知道变量的作用域.Jav ...

  9. 2.4配置的热更新「深入浅出ASP.NET Core系列」

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 大家知道通常我们修改网站的配置文件比如,webconfig的时候,网站需要重启才能读取到最新的修改,所谓热更新就是 ...

  10. C#开发——网站应用微信登录开发

    1. 在微信开放平台注册开发者账号,并有一个审核已通过的网站应用,并获得相对应的AppID和AppSecret,申请通过登陆后,方可开始接入流程. 2.微信OAuth2.0授权登录目前支持author ...