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阻 ...
随机推荐
- LSTM调参经验
0.开始训练之前先要做些什么? 在开始调参之前,需要确定方向,所谓方向就是确定了之后,在调参过程中不再更改 1.根据任务需求,结合数据,确定网络结构. 例如对于RNN而言,你的数据是变长还是非变长:输 ...
- 腾讯云,搭建 FTP 文件服务
腾讯云,搭建 FTP 文件服务 腾讯云,搭建 FTP 文件服务 安装并启动 FTP 服务 任务时间:5min ~ 10min 安装 VSFTPD 使用 yum 安装 vsftpd: yum insta ...
- 使用IMAGEMAGICK的CONVERT工具批量转换图片格式
使用IMAGEMAGICK的CONVERT工具批量转换图片格式 http://www.qiansw.com/linux-imagemagick-convert-img.html Home > 文 ...
- C语言分支/顺序作业总结
总结 1.1 基本要求(1分) 按时交 - 有分 未交 - 0分 迟交一周以上 - 倒扣本次作业分数 抄袭 - 0分 博客作业格式不规范,没有用Markdown语法 -扣分 泛泛而谈(最多七分) 1. ...
- java面向对象课程设计-数学表达式计算器
项目简介 设计一个计算器,其能够: 1)由用户输入一个简单的四则运算表达式,求出其计算结果后显示. 2)特殊数学函数,如:绝对值.取整.三角函数.倒数.平方根.平方.立方等. 3)对一定范围内的数字将 ...
- fork开源代码后如何基于某个tag建立自己的branch
应用场景: 在github上fork一个自己想看的开源项目,想基于某个tag来写一些测试demo,然后可以做到版本控制. 方法: //克隆 git clone xxxxx.git //查看tag gi ...
- 【工具学习】——教你读懂Maven的配置文件
[前言] 最近在项目中用到了maven工具,相信很多第一次接触maven的人都有这样的困惑,maven的文件很简单,就像下图中的结构一样,但是它的功能十分强大,那是怎么做到的呢?配置文件!配置文件里是 ...
- Python创建目录文件夹
Python对文件的操作还算是方便的,只需要包含os模块进来,使用相关函数即可实现目录的创建. 主要涉及到三个函数 1.os.path.exists(path) 判断一个目录是否存在 2.os.mak ...
- Zebra - zebra command to get printer error and warning status
1 Flag2 Nibble 16-93 Nibble 8-44 Nibble 35 Nibble 26 Nibble 1
- 算法(5)Jump Game
题目:非负数的数组,每个数组元素代表这你能最大跨越多少步,初始在0的位置,问,能不能正好调到数组的最后一位! https://leetcode.com/problems/jump-game/#/des ...