网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
概述
这个模块允许在select模块原语的基础上实现高水平和高效的I/O复用。我们鼓励用户改用这个模块,除非想精确控制所使用的操作系统级原语。
它定义了一个BaseSelector抽象基类,以及几个具体的实现(KqueueSelector、EpollSelector…),可以用来等待多个文件对象上的I/O就绪通知。在下面的“file object”中,“file object”是指具有fileno()方法或原始文件描述符的任何对象。请参见文件对象。
DefaultSelector是当前平台上最有效的实现的别名:对于大多数用户来说,这应该是默认的选择。
注意:
支持的文件对象的类型取决于平台:在Windows上, 支持套接字,但不支持管道,而在Unix上,两者都受支持 (也可能支持其他一些类型,例如fifos或特殊文件设备)。
类
类层次结构:
BaseSelector
+-- SelectSelector
+-- PollSelector
+-- EpollSelector
+-- DevpollSelector
+-- KqueueSelector
在下文中, event是一个位掩码,指示在给定的file对象上应该等待哪些I/O事件。它可以是以下模块的组合:
SelectorKey
SelectorKey是一个命名元组,用于将文件对象与其基础文件描述符、选定的事件掩码和附加数据相关联。它由几个BaseSelector方法返回。
- fileobj:已注册的文件对象。
- fd:基础文件描述符。
- events:必须在此文件对象上等待的事件。
- data:与此文件对象关联的可选不透明数据:例如, 可用于存储每个客户端会话ID。
BaseSelector
BaseSelector用于等待多个文件对象上的I/O事件准备就绪。它支持文件流注册、注销和等待这些流上的I/O事件的方法,并提供可选的超时。它是一个抽象基类,因此无法实例化。如果想具体使用一个实现,那么请改用DefaultSelector,或者使用SelectSelector、KqueueSelector等之一。BaseSelector及其具体实现支持上下文管理器协议。
抽象方法 register
(fileobj, events, data=None)
注册一个文件对象以供选择,监视它的I/O事件。
fileobj是要监视的文件对象。FileDescriptor()可以是不带整数的FileDescriptor方法。
event是要监视的事件的位掩码。
data是一个不透明的对象。
返回一个新的SelectorKey实例,如果事件掩码或文件描述符无效,则引发ValueError;如果文件对象已注册,则引发KeyError。
抽象方法unregister
(fileobj)
从选择中注销文件对象,将其从监视中删除。文件对象在关闭之前应注销。
fileobj必须是以前注册的文件对象。
返回关联的SelectorKey实例,或者在fileobj未注册的情况下引发KeyError。如果fileobj无效(例如,它没有fileno()方法或其fileno()方法的返回值无效),则会引发ValueError。
抽象方法select(timeout=None)
等待一些注册的文件对象准备就绪,或者超时过期。
如果timeout>0,则指定最大等待时间(以秒为单位)。如果timeout<=0,则调用不会阻塞,并将报告当前就绪的文件对象。如果一个timeout为“None”,调用将被阻止,直到被监视的文件对象准备就绪。
返回(key,events)元组的列表,每个就绪file对象一个。
- key是与ready file对象对应的SelectorKey实例。
- events是此文件对象上准备好的事件的位掩码。
注意:
如果当前进程接收到信号,则此方法可以在任何文件对象准备就绪或超时之前返回:在这种情况下,将返回一个空列表。
DefaultSelector
默认选择器类,使用当前平台上最有效的实现。这应该是大多数用户的默认选择。
SelectSelector
基于选择器select.selector()。
PollSelector
基于选择器select.poll()。
EpollSelector
基于选择器select.epoll()。
fileno
():返回底层使用的文件描述符select.epoll()对象。
DevpollSelector
基于选择器select.devpoll()。
fileno
():返回底层使用的文件描述符select.devpoll()对象。
KqueueSelector
基于选择器select.kqueuepoll()。
fileno
():返回底层使用的文件描述符select.kqueue()对象。
例子
这是一个简单的回显服务器实现:
import selectors
import socket
sel = selectors.DefaultSelector()
def accept(sock, mask):
conn, addr = sock.accept() # Should be ready
print('accepted', conn, 'from', addr)
conn.setblocking(False)
sel.register(conn, selectors.EVENT_READ, read)
def read(conn, mask):
data = conn.recv(1000) # Should be ready
if data:
print('echoing', repr(data), 'to', conn)
conn.send(data) # Hope it won't block
else:
print('closing', conn)
sel.unregister(conn)
本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。
最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。
最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。
![](https://img-blog.csdnimg.cn/img_convert/311903982dea1d8a5d2c98fc271b5b41.jpeg)
### 学习路线图
其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。
相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。
![](https://img-blog.csdnimg.cn/img_convert/1ddfaf7dc5879b1120e31fafa1ad4dc7.jpeg)
#### 网络安全工具箱
当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份**我自己整理的网络安全入门工具以及使用教程和实战。**
![](https://img-blog.csdnimg.cn/img_convert/bcd1787ce996787388468bb227d8f959.jpeg)
#### 项目实战
最后就是项目实战,这里带来的是**SRC资料&HW资料**,毕竟实战是检验真理的唯一标准嘛~
![](https://img-blog.csdnimg.cn/img_convert/35fc46df24091ce3c9a5032a9919b755.jpeg)
#### 面试题
归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**