selectors
一、Selectors模块
它具有根据平台选出最佳的IO多路机制,比如在win的系统上他默认的是select模式而在linux上它默认的epoll,建议使用selectors。
常用共分为三种:select、poll、epoll
二、用法
selectors server
# -*- coding: UTF-8 -*- import selectors
import socket # 生成一个selectors对象
# 根据平台选择最佳的IO多路机制,比如linux就会选择epoll
sel = selectors.DefaultSelector() def accept(sock, mask): # 参数scok就是while循环中的key.fileobj
conn, addr = sock.accept() # 相当于select 的readable 列表
print('accepted', conn, 'from', addr, '****', mask)
conn.setblocking(False)
sel.register(conn, selectors.EVENT_READ, read) # 新连接注册read回调函数 def read(conn, mask):
data = conn.recv(1024)
if data:
print('echoing', repr(data), 'to', conn)
conn.send(data)
else: # 没数据代表断了
print('closing', conn)
sel.unregister(conn)
conn.close() server = socket.socket()
server.bind(('localhost', 9999))
server.listen()
server.setblocking(False)
# 注册事件,将server注册到sel中,让sel去监听
# accept 只要来一个新连接,就调用这个函数
sel.register(server, selectors.EVENT_READ, accept) while True:
events = sel.select()
# 默认是阻塞的,有活动连接时返回活动的连接列表,event就是这活动列表
# select(), 可能是select/epoll 看系统支持
print(events) for key, mask in events:
callback = key.data # 相当于调用 accept, callback获取了函数地址
callback(key.fileobj, mask) # key.fileobj 是文件句柄
下面开始强行解释了。。。。。
2.1 生成一个selectors对象
sel = selectors.DefaultSelector()
根据平台选择最佳的IO多路机制,比如linux就会选择epoll,windows不支持epoll,所以会用select。
2.2 监听server
server = socket.socket()
server.bind(('localhost', 9999))
server.listen()
server.setblocking(False)
2.3 注册事件
sel.register(server, selectors.EVENT_READ, accept)
将server注册到sel中,让sel去监听,只要有一个新连接进来,就调用accept函数
2.4 循环事件
while True:
events = sel.select()
print(events) for key, mask in events:
callback = key.data
callback(key.fileobj, mask)
循环接收连接和数据,默认是阻塞的。只要有活动连接进来,就返回一个列表events。同时sel.select()可根据系统自动选定epoll/select模式。
events:
[(SelectorKey(fileobj=<socket.socket fd=268, family=AddressFamily.AF_INET,
type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999)>,
fd=268, events=1, data=<function accept at 0x000002575F87E488>), 1)]
callback = key.data,其实就是accept函数的内存地址
callback() 就是调用accept函数。
key.fileobj ,mask分别是accept函数的两个参数。fileobj很好理解,就是监听的socket的文件句柄。而mask指的是事件类型,EVENT_READ 是 1 ,EVENT_WRITE 是 2。
2.5 accept函数
accept函数的功能类似于 select中的 readable列表,当有一个连接进来时,不立刻接收或发生数据,而是放到一个队列中,再从队列中获取/返回数据。accept函数将监听的连接注册到一个事件中,调用read函数,数据的收发就在read函数中进行。
有数据进来时,events:
[(SelectorKey(fileobj=<socket.socket fd=352, family=AddressFamily.AF_INET,
type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999),
raddr=('127.0.0.1', 50853)>, fd=352, events=1, data=<function read at 0x000002575F87EA60>), 1)] echoing b'sdfsdf' to <socket.socket fd=352, family=AddressFamily.AF_INET,
type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999), raddr=('127.0.0.1', 50853)>
accept函数执行完毕后,对一个连接的监听建立。如果这个连接再发生数据到server端,events中的fileobj就会变成 这个scoket连接的信息,key.data就是read函数的内存地址:
此时,callback(key.fileobj, mask) = read(key.fileobj, mask)
2.6 read函数
对监听的连接收发数据,断开连接等处理。
selectors的更多相关文章
- DOM扩展-Selectors API(选择符 API)、元素遍历
DOM扩展 对DOM的两个主要扩展是SelectorsAPI(选择符API)和HTML5 SelectorsAPI(选择符API)是由W3C发起制定的一个标准,致力于浏览器原生支持CSS查询,Sele ...
- BeautifulSoup高级应用 之 CSS selectors /CSS 选择器
BeautifulSoup支持最常用的CSS selectors,这是将字符串转化为Tag对象或者BeautifulSoup自身的.select()方法. 本篇所使用的html为: html_doc ...
- CSS 笔记六(Image/Attribute Selectors)
Image Opacity / Transparency The CSS opacity property is a part of the CSS3 recommendation. Example ...
- CSS 笔记一(Selectors/ Backgrounds/ Borders/ Margins/ Padding/ Height and Width)
Selectors/ Backgrounds/ Borders/ Margins/ Padding/ Height and Width CSS Introduction: CSS stands for ...
- DOM扩展之Selectors API
jQuery的核心就是通过CSS选择符查询DOM文档取得元素的引用,从而抛开了getElementById()和getElementsByTagName(). Selectors API致力于让浏览器 ...
- 转:SELENIUM TIPS: CSS SELECTORS
This page will show you some CSS rules and pseudo-classes that will help you move your XPATH locator ...
- selectors实现高并发
1. 下面的例子,客户端给服务端发送消息,服务端把消息返回 server #!/usr/bin/env python import selectors import socket import tim ...
- 【CSS3】Advanced3:Universal, Child, and Adjacent Selectors
1.Universal selectors eg:#target*{ } 2.Child selectors < something immediately nested within some ...
- 【CSS】Intermediate1:Class and ID Selectors
1.html tag = css selector 2.Define your own selectors in the form of class and ID selectors 3. .clas ...
- 【CSS】Beginner2:Selectors, Properties, and Values
1.Whereas HTML has tags,CSS has selectors. 2.Selector{ properties:value; properties2:value2; } 3 ...
随机推荐
- 亚马逊与Twitter携手电子商务
亚马逊(Amazon)与Twitter开展了合作,允许用户以Twitter消息的形式将喜欢的商品发送到购物篮中.这些高科技企业正在想办法把社交媒体和电子商务融为一体. 这一功能旨在将Twitter转变 ...
- 手动配置网卡配置文件ifcfg-eth0
linux 其他知识目录 原文链接:https://www.cnblogs.com/arvintang/p/5990599.html 网络接口配置文件[root@localhost ~]# cat / ...
- linux下svn操作(专)
原文地址:https://www.cnblogs.com/clicli/p/5913330.html svn命令在linux下的使用SVN软件版本管理 1.将文件checkout到本地目录svn ch ...
- Linux 环境下svn 服务器搭建
可使用自己下载的svn安装包,但要安装相关依赖包,yum 安装源提供的稳定版本svn 1.yum -y install subversion 2.创建本地库 mkdir -p /var/svn svn ...
- SSM整合CRUD操作(一)
http://www.cnblogs.com/loger1995/p/6352179.html?utm_source=itdadao&utm_medium=referral 说明:这是我刚开始 ...
- Hive查看执行日志
HIVE-如何查看执行日志 HIVE既然是运行在hadoop上,最后又被翻译为MapReduce程序,通过yarn来执行.所以我们如果想解决HIVE中出现的错误,需要分成几个过程 HIVE自身翻译成为 ...
- (转)微软借力.NET开源跨平台支持,布局物联网平台开发
今天科技类最大的新闻,莫过于微软宣布.NET开发框架开源计划..NET 开源,集成 Clang 和 LLVM 并且自带 Android 模拟器,这意味着 Visual Studio 这个当下最好没有之 ...
- sleep() 与 wait()的比较
1.这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类. sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还 ...
- centos中apache自用常用额外配置记录(xwamp)
xwamp套件中apache配置,记录下,以免忘记. 配置路径 ${wwwroot_dir}/conf/httpd.conf 配置内容 <ifmodule mod_deflate.c> D ...
- 第147天:web前端开发中的各种居中总结
一.水平居中 方法① :行内元素 (父元素)text-align,(子元素)inline-block .parent{text-align: center;} .child{display: inli ...