文章目录

  • 一、事件驱动模型
  • 二、IO多路复用

本篇文章是关于涉及网络编程与协程、进程之间结合的内容,其中事件驱动模型、IO多路复用、select与epoll的使用等方面的知识

一、事件驱动模型

1、事件驱动编程思想
是一种编程范式,跟面向对象、面向过程一样,就是一种编程思想。

2、事件驱动模型
通常,我们写服务器处理模型的程序时,有以下几种模型:

(1)每收到一个请求,创建一个新的进程,来处理该请求;
(2)每收到一个请求,创建一个新的线程,来处理该请求;
(3)每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求

第(3)种就是协程、事件驱动的方式,第(3)种方式是大多数网络服务器采用的方式

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

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

二、IO多路复用

就是可以同时监听多个连接;
比如socketserver,多个客户端连接,单线程下实现并发效果,就叫多路复用。
1、 阻塞 IO(blocking IO)
在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样:

当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据。对于network io来说,很多时候数据在一开始还没有到达(比如,还没有收到一个完整的UDP包),这个时候kernel就要等待足够的数据到来。而在用户进程这边,整个进程会被阻塞。当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果,用户进程才解除block的状态,重新运行起来。
所以,blocking IO的特点就是在IO执行的两个阶段都被block了

2、非阻塞 IO(non-blocking IO)

在网络IO时候,非阻塞IO也会进行recvform系统调用,检查数据是否准备好,与阻塞IO不一样,”非阻塞将大的整片时间的阻塞分成N多的小的阻塞,
所以进程不断地有机会 ‘被’ CPU光顾”。即每次recvform系统调用之间,cpu的权限还在进程手中,这段时间是可以做其他事情的,

也就是说非阻塞的recvform系统调用调用之后,进程并没有被阻塞,内核马上返回给进程,如果数据还没准备好,此时会返回一个error。进程在返回之后,可以干点别的事情,然后再发起recvform系统调用。重复上面的过程,循环往复的进行recvform系统调用。这个过程通常被称之为轮询。轮询检查内核数据,直到数据准备好,再拷贝数据到进程,进行数据处理。需要注意,拷贝数据整个过程,进程仍然是属于阻塞的状态。

3、IO 多路复用(IO multiplexing)
(1)它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。

当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。

分为select(任何系统下都通用的)、poll、epoll(效果最好);
另外, select的优势在于可以处理多个连接,不适用于单个连接

(2)用select实现并发聊天
服务端:

import socket
import select  #导入select模块#实例化socket对象
sk=socket.socket()sk.bind(("192.168.43.247",8801))
sk.listen(5)
inputs=[sk,]#收发消息
while True:#开启select监听,将获得的链接存在r里面r,w,e=select.select(inputs,[],[],5)for obj in r:   #此时r内就只有[sk,]if obj==sk:conn,add=obj.accept()print(conn)inputs.append(conn)else:data_byte=obj.recv(1024)print(str(data_byte,'utf8'))inp=input('回答%s号客户>>>'%inputs.index(obj))obj.sendall(bytes(inp,'utf8'))print('>>>',r)

客户端:

import socketsk = socket.socket()
sk.connect(('192.168.43.247',8801))while True:inp = input("请输入聊天信息:")sk.sendall(bytes(inp, "utf8"))data = sk.recv(1024)print(str(data, 'utf8'))

执行结果:

Python之进程+线程+协程(事件驱动模型、IO多路复用、select与epoll)相关推荐

  1. Python之进程+线程+协程(异步、selectors模块、阻塞、非阻塞IO)

    文章目录 一.IO多路复用 二.selectors模块 本篇文字是关于IO多路复用的更深入一步的总结,上一篇 Python之进程+线程+协程(事件驱动模型.IO多路复用.select与epoll)对I ...

  2. Python之进程+线程+协程(并发与并行、GIL锁、同步锁、死锁、递归锁)

    文章目录 一.并发与并行 二.同步与异步 三.线程锁 1.GIL全局解释器锁 2.同步锁 3.死锁 4.递归锁 在Python中GIL解释器锁.同步锁.死锁.递归锁都是什么?怎么这么多锁,它们都是用来 ...

  3. Python之进程+线程+协程(生产者消费者模型)

    本篇主要总结一下非常有名的生成者消费者模型 概念引用 1.为什么要使用生产者和消费者模型? 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程.在多线程开发当中,如果生产者处理速度很快, ...

  4. Python之进程+线程+协程(进程的本质 与 threading线程模块)

    文章目录 基本概念 threading线程模块 本篇开始分析Python中的并发程序,也就是进程.线程.协程序的使用.由于是用自己的语言总结的,因此比较大白话,或者叫通俗易懂.而且很多细节方面没有具体 ...

  5. Python之进程+线程+协程(multiprocessing多进程模块)

    前几篇的多线程模块的各种规则和用法,本篇则是关于多进程模块的内容 1.multiprocessing的介绍 在Python中,由于有GIL解释器锁的存在,多线程就根本不是本质意义上的多线程,而是一个主 ...

  6. Python之进程+线程+协程(同步对象、信号量、队列)

    文章目录 Event同步对象 semaphore信号量 队列 本篇是关于Python进程方面的内容了,主要是Event同步对象,信号量和队列 Event同步对象 1.概念: 我们可以对一个线程set一 ...

  7. Python之进程+线程+协程(进程间通信、进程同步、进程池、回调函数)

    文章目录 进程间通信 进程同步 进程池 回调函数 本篇文章依然是进程.线程方面的内容,主要讲进程间的通信.进程队列.进程同步.进程池.进程同步和回调函数 进程间通信 进程就是两个独立的内存空间在运行, ...

  8. linux的进程/线程/协程系列5:协程的发展复兴与实现现状

    协程的发展复兴与实现现状 前言 本篇摘要: 1. 协同制的发展史 1.1 协同工作制的提出 1.2 自顶向下,无需协同 1.3 协同式思想的应用 2. 协程的复兴 2.1 高并发带来的问题 2.2 制 ...

  9. Linux的进程/线程/协程系列4:进程知识深入总结:上篇

    Linux的进程/线程/协程系列4:进程/线程相关知识总结 前言 本篇摘要: 1. 进程基础知识 1.1 串行/并行与并发 1.2 临界资源与共享资源 1.3 同步/异步与互斥 1.4 进程控制原语 ...

最新文章

  1. 前后端分离后的前端时代
  2. 08-cmake语法-set()
  3. laravel项目运行 php artisan cache:clear 命令报错
  4. CCF - 201403-3 - 命令行选项
  5. php文件操作(上传文件)1
  6. for循环连续创建对象
  7. 苹果Mac系统无法输入密码的解决办法
  8. 一步一步学做一个CPU——2,Logisim的简单入门
  9. sas不能安装独立的java_SAS安装问题解决办法
  10. QCC512x QCC302x Earbud 工程增加三击事件
  11. 【干货分享】用AI工具设计一款吸引人的字体效果
  12. Facebook登录服务器端接入
  13. 如何使用虚拟专用网络登录网络设备?
  14. 热烈祝贺 Entrust 正式成为本届SDS赞助商
  15. 利用novnc登录绕过WFA
  16. java --help_java help
  17. 一年前,没有Android,我还是一个游戏开发者
  18. 【算法】贪婪算法——每步都是最优解
  19. 网络设备配置与管理-综合实验2
  20. 网页中的png图片无法显示?

热门文章

  1. 戴毅茹同济matlab,Stateflow系统建模(全)解读.pptx
  2. 项目中查询数据和模糊查询
  3. 快速修剪技巧_20个相见恨晚的CAD画图神技巧,让你效率飞升!
  4. python包之间引用_python 子包引用父包和其他子包
  5. python3 threading.lock_Python3 threading
  6. python最基本的语句_Python的基本语句
  7. mysql修改表字段小数点精度_技术篇-将字段类型decimal批量处理从2位改为4位小数点sql,解决数据库存储精度...
  8. 登录不了_12123APP登录不了肿么办?快来看这里!
  9. html li之间的间隙,求助大神 如让图片展示在li标签里面,不要间隙 谢谢
  10. JavaEE中用response向客户端输出中文数据乱码问题分析