python协程和异步IO——IO多路复用C10k是一个在1999年被提出来的技术挑战,如何在一颗1GHz CPU,2G内存,1gbps网络环境下,让单台服务器同时为1万个客户端提供FTP服务
阻塞式I/O(使用最多)、非阻塞式I/O、I/O复用、信号驱动式I/O(几乎不使用)、异步I/O(POSIX的aio_系列函数)
select、poll、epoll都是IO多路复用的机制 。I/O多路复用就是通过一种机制,一个进程可以监听多个描述符,一旦,某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作 。但select、poll、epoll本质上都是同步I/O,因为他们都需要在读写时间就绪后负责进行读写,也就是说读写过程是阻塞的,而异步I/O无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间
(1)select
select函数监视的文件描述符分3类,分别是writefds、readfds、exceptfds 。调用select函数会阻塞,直到有描述符就绪(有数据可读、可写或者有except),或者超时函数返回 。当select函数返回后可以通过遍历fdset来找到就绪的描述符 。
select目前几乎在所有的平台上支持,其良好的跨平台支持也是它的一个优点 。select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但是这样也会降低效率 。
(2)poll
不同于select使用三个位图来表示三个fdset的方式,poll使用一个pollfd的指针实现 。
pollfd结构包含了要监视的event和发生的event,不再使用select"参数-值"传递的方式 。同时pollfd并没有最大数量限制(但是数量过大后性能也会下降) 。和select函数一样,poll返回后,需要轮询pollfd来获取就绪的描述符 。
从上面看,select和poll都需要在返回后通过遍历文件描述符来获取已经就绪的socket 。事实上同时连接的大量客户端在同一时刻可能只有很少的处于就绪的状态,因此随着监视的描述符数量的增长,其效率也会线性下降
(3)epoll
epoll是在2.6内核中提出的,是之前的select和poll的增强版本 。相对于select和poll来说,epoll更加领灵活,没有描述符限制 。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次 。
python中,面向对象有哪些机制有利于代码复用?Python中面向对象编程有以下机制有利于代码复用:
1.继承(Inheritance):子类可以继承父类的属性和方法,并且可以在不改变父类的情况下对其进行扩展或修改,从而减少代码的重复编写 。例如,一个父类定义了通用的方法,子类可以继承这些方法并添加特定的实现 。
在这个例子中,我们定义了一个父类 Animal,它有两个属性 name 和 species,还有一个抽象方法 make_sound 。然后我们定义了一个子类 Dog,它从父类 Animal 中继承了 name 和 species 属性,并重写了 make_sound 方法,以实现狗的叫声 。由于我们使用继承,所以 Dog 类可以重用 Animal 类的代码,而不必重新编写 。
2.多态(Polymorphism):多态允许不同的对象以不同的方式对同一个消息作出响应 。例如,一个类的不同实例可以实现相同的方法,但表现出不同的行为 。这使得代码更加灵活和可扩展 。
在这个例子中,我们定义了一个抽象基类 Shape,它有一个抽象方法 area 。然后我们定义了两个子类 Rectangle 和 Circle,它们分别实现了 area 方法,以计算矩形和圆形的面积 。由于它们都继承了 Shape 类,并实现了相同的方法名 area , 所以我们可以通过相同的方式对它们进行操作,以实现多态 。例如:
在这个例子中,我们创建了一个包含两个不同类型的对象的列表 , 并使用循环对它们进行操作 。由于它们都实现了 area 方法,所以我们可以使用相同的方式调用它们的方法,以计算它们的面积 。
推荐阅读
- gis标记填充符号比例,arcgis标记符号
- java代码带上this,java的this
- 路由器换新怎么连接网络,路由器换新怎么连接网络设置
- phpcms取文章列表,php获取txt内容
- vb.net试题程序设计的简单介绍
- c语言新建源程序,c语音新建
- js追加表格的行html,js追加html代码
- 陕西联通服务器地址云空间,联通 云服务器
- vb.net生成注册码 vb制作用户注册功能