python--selectors
import socket
from selectors import DefaultSelector, EVENT_READ, EVENT_WRITE
# 会根据当前的操作系统选择一个合适的文件描述符,Linux下是epoll,Windows下则是select
selector = DefaultSelector()
class Fetcher:
def __init__(self, host):
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client.setblocking(False) # 设置非阻塞socket
self.host = host
def get_url(self):
try:
self.client.connect((self.host, 80))
except BlockingIOError:
# 也可以做一些其他的事
pass
# 将socket注册一个事件,self.client.fileno()是当前socket的文件描述符,
# EVENT_WRITE表示可写,因为我们连接建立好之后要send一个请求(相当于写数据),所以等待一个可写状态
# 并且绑定一个回调函数,如果连接建立好了,说明可以写了,那么就调用相应的回调函数
selector.register(self.client.fileno(), EVENT_WRITE, self.send_request)
def send_request(self, key):
# 这里的参数key指的便是调用当前函数的socket
# 调用了之后,我们就不再监视了,因此要取消注册,key.fd指的便是key(当前socket)的fd(file descriptor)
selector.unregister(key.fd)
self.client.send("GET {} HTTP/1.1\r\nHost:{}\r\nConnection:close\r\n\r\n".format("/", self.host).encode("utf-8"))
# 这时候便将我们的请求发出去了,但是我们还要继续注册新的socket
# EVENT_READ指的是可读,我们发送一个请求之后要等待服务器返回数据(相当于读数据),所以等待一个可读状态
# 当满足可读状态,那么调用相应的回调函数读取数据
selector.register(self.client.fileno(), EVENT_READ, self.read_data)
def read_data(self, key):
data = b""
recv = self.client.recv(1024)
if recv:
data += recv
else:
# 值获取完毕,那么取消注册
selector.unregister(key.fd)
print(str(data, encoding="utf-8", errors="ignore"))
def loop_forever():
# 事件循环,为什么需要事件循环
# 因为我们上面绑定的回调函数没办法自动调用,所以我们必须创建一个事件循环,不断地从里面取出满足状态的socket
while 1:
ready = selector.select()
for key, mask in ready:
# key.data就是我们注册的回调的函数
call_back = key.data
# 将key也就是相应的socket主动传进去
call_back(key)
if __name__ == '__main__':
fetcher = Fetcher("www.baidu.com")
fetcher.get_url()
loop_forever()
可以看到,这种编程模式将我们的代码割的四分五裂。因此程序员更喜欢使用同步的方式编写异步代码
python--selectors的更多相关文章
- Python/ selectors模块及队列
Python/selectors模块及队列 selectors模块是可以实现IO多路复用机制: 它具有根据平台选出最佳的IO多路机制,比如在win的系统上他默认的是select模式而在linux上它默 ...
- Python - selectors 模块
selectors 模块 它的功能与 linux 的 epoll,还是 select 模块, poll 等类似: 实现高效的 I/O multiplexing , 常用于非阻塞的 socket ...
- Python selectors实现socket并发
selectors模块 此模块允许基于选择模块原语构建高级别和高效的I / O多路复用. 鼓励用户使用此模块,除非他们想要精确控制使用的os级别的原语. 注:selectors也是包装了select高 ...
- python selectors模块实现 IO多路复用机制的上传下载
import selectorsimport socketimport os,time BASE_DIR = os.path.dirname(os.path.abspath(__file__))''' ...
- Day15 - Python基础15 模块学习-selectors
本节内容 1:Python/selectors模块 2:selsect实例 1:Python/selectors模块及队列 selectors模块是可以实现IO多路复用机制: 它具有根据平台选出最佳 ...
- Python 运维之路
第一章:Python基础知识 1.Python 变量了解 .Python 二进制 .Python 字符编码 4.Python if条件判断 5.Python while循环 6.Python for循 ...
- (转)python异步编程--回调模型(selectors模块)
原文:https://www.cnblogs.com/zzzlw/p/9384308.html#top 目录 0. 参考地址 1. 前言 2. 核心类 3. SelectSelector核心函数代码分 ...
- python 利用selectors实现异步I/O
它的功能与linux的epoll,还是select模块,poll等类似:实现高效的I/O multiplexing, 常用于非阻塞的socket的编程中: 简单介绍一下这个模块,更多内容查看 pyt ...
- python异步编程--回调模型(selectors模块)
目录 0. 参考地址 1. 前言 2. 核心类 3. SelectSelector核心函数代码分析 3.1 注册 3.2 注销 3.3 查询 4. 别名 5. 总结 6. 代码报错问题 1. 文件描述 ...
- python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)
昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...
随机推荐
- hadoop节点之间通信问题
前天遇到一个hadoop问题,由于之前都是伪分布的情况,没有真正的涉及到集群的环境,最近按照一些资料自己搭建了一个集群环境,三台虚拟机,一个master,两个slave,利用jps查看节点信息,启动了 ...
- Spring MVC温故而知新 – 参数绑定、转发与重定向、异常处理、拦截器
请求参数绑定 当用户发送请求时,根据Spring MVC的请求处理流程,前端控制器会请求处理器映射器返回一个处理器,然后请求处理器适配器之心相应的处理器,此时处理器映射器会调用Spring Mvc 提 ...
- Graphic的一些基本概念
做了张很丑陋的图,估计还不准确...先凑合看吧~
- 怎么设置table(表格)手机端自适应宽度
我们在wordpress文章页面经常会用到表格,有些是从其他网页或者文档复制粘贴过来的,在电脑设备网页上都能很好的展示,但是在移动设备上或者低分辨率设备上却经常撑破列宽,很是影响美观和客户体验.这里就 ...
- 【bzoj3813】奇数国 线段树
题目描述 给出一个长度为n的序列,每个数都可以由前60个质数的乘积表示,初始每个数都是3.支持两种操作:(1)修改一个数 (2)查询一段区间内所有数的乘积的欧拉函数值模19961993. 输入 第一行 ...
- Java23个设计模式的简明教程
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...
- Linux产生背景
By francis_hao Oct 26,2016 很久很久以前,大概在1965年左右,由贝尔实验室(Bell).麻省理工学院(MIT)及通用电气公司(GE)共同发起了一个叫做Multics的项目, ...
- php设定错误和异常处理可使用的函数
1.register_shutdown_function 使用场景:当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,这个函数会被调用. 函数介绍: void register_shutdown ...
- 数据结构之(HDU2051 Bitset)
Problem Description Give you a number on base ten,you should output it on base two.(0 < n < 10 ...
- 搭建eova开发环境
1.安装好maven 2.下载Eova项目解压到文件夹eova下 3.dos命令到eova文件夹下执行mvn eclipse:eclipse(注:构建eclipse项目命令) 4.修改*.tag文件错 ...