select编程[回调+事件循环]
感觉比java写起来还要忧伤.....
"""
select , poll,epoll
注意: epoll并不一定比select的性能好,这需要看场景
1. 在高并发场景,且连接活跃度不是很高的时候,epoll比select好, 比如web应用
2. 在并发不高,但连接很活跃的场景下,select 比epoll好, 比如游戏 编程模式: select + 事件循环 + 回调 """
import socket
from urllib.parse import urlparse
# 使用DefaultSelector时, python会根据应用平台自动选择select模式或者epoll模式
# DefaultSelector 对select 和 epoll进行了封装
from selectors import DefaultSelector, EVENT_READ, EVENT_WRITE selector = DefaultSelector() # 使用select 完成http请求 (window不支持epoll)
urls = ["http://www.baidu.com"]
stop = False # 设置一个全局变量,用控制loop结束,否则在window环境下会报错 class Fetcher:
def get_url(self, url):
'''通过socket完成http请求'''
self.url = url
url = urlparse(url)
self.host = url.netloc
self.path = url.path
if self.path == "":
self.path = "/"
# 建立socket连接
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client.setblocking(False) # 设置成非阻塞模式
self.data = b"" # 表示字节
try:
self.client.connect((self.host, 80))
except BlockingIOError as e:
pass
# 注册, 监听write事件回调
selector.register(self.client.fileno(), EVENT_WRITE, self.writable) def writable(self, key):
'''写回调函数'''
selector.unregister(key.fd)
self.client.send(
"GET {} HTTP/1.1\r\nHOST:{}\r\nConnection:close\r\n\r\n".format(self.path, self.host).encode("utf-8"))
# 注册, 监听read事件回调
selector.register(self.client.fileno(), EVENT_READ, self.readable) def readable(self, key): d = self.client.recv(1024)
if d:
self.data += d
else: # 数据读取完毕
selector.unregister(key.fd)
data = self.data.decode("utf-8")
html_data = data.split('\r\n\r\n')[1]
print(html_data)
self.client.close()
urls.remove(self.url) # 处理完毕一个url后,就将url从urls中移除
if not urls: # 如果urls中没有数据了, 就可以停止loop循环事件了
global stop
stop = True def loop():
'''
事件循环,不停的请求socket的状态,并调用对应的回调函数 :return:
'''
# 1. select 本身并不支持register模式,但是DefaultSelector对select进行了封装
# 2. socket 状态变化以后的回调是由程序来完成, 并不是由操作系统来完成
while not stop:
ready = selector.select()
for key, mask in ready:
call_back = key.data
call_back(key) if __name__ == '__main__':
fetcher = Fetcher()
fetcher.get_url('http://www.baidu.com')
loop()
select编程[回调+事件循环]的更多相关文章
- select + 回调 + 事件循环
#1. epoll并不代表一定比select好 # 在并发高的情况下,连接活跃度不是很高, epoll比select # 并发性不高,同时连接很活跃, select比epoll好 #通过非阻塞io实现 ...
- (转)python异步编程--回调模型(selectors模块)
原文:https://www.cnblogs.com/zzzlw/p/9384308.html#top 目录 0. 参考地址 1. 前言 2. 核心类 3. SelectSelector核心函数代码分 ...
- python异步编程--回调模型(selectors模块)
目录 0. 参考地址 1. 前言 2. 核心类 3. SelectSelector核心函数代码分析 3.1 注册 3.2 注销 3.3 查询 4. 别名 5. 总结 6. 代码报错问题 1. 文件描述 ...
- Node.js 事件循环(Event Loop)介绍
Node.js 事件循环(Event Loop)介绍 JavaScript是一种单线程运行但又绝不会阻塞的语言,其实现非阻塞的关键是“事件循环”和“回调机制”.Node.js在JavaScript的基 ...
- node.js的作用、回调、同步异步代码、事件循环
http://www.nodeclass.com/articles/39274 一.node.js的作用 I/O的意义,(I/O是输入/输出的简写,如:键盘敲入文本,输入,屏幕上看到文本显示输出.鼠标 ...
- JavaScript是如何工作的:事件循环和异步编程的崛起 + 5种使用 async/await 更好地编码方式!
摘要: 深度理解JS事件循环!!! 原文:JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 async/await 更好地编码方式! 作者:前端小智 Fundebug经授权转载, ...
- Node.js:创建应用+回调函数(阻塞/非阻塞)+事件循环
一.创建应用 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi.从这个角度看,整个"接收 HTTP ...
- How Javascript works (Javascript工作原理) (四) 事件循环及异步编程的出现和 5 种更好的 async/await 编程方式
个人总结: 1.讲解了JS引擎,webAPI与event loop合作的机制. 2.setTimeout是把事件推送给Web API去处理,当时间到了之后才把setTimeout中的事件推入调用栈. ...
- JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 async/await 更好地编码方式!
为什么单线程是一个限制? 在发布的第一篇文章中,思考了这样一个问题:当调用堆栈中有函数调用需要花费大量时间来处理时会发生什么? 例如,假设在浏览器中运行一个复杂的图像转换算法. 当调用堆栈有函数要执行 ...
随机推荐
- Python学习之表的数据类型
数据类型 数值类型 类型 大小 范围(有符号) 范围(无符号)unsigned约束 用途 TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 ...
- DSP28335 eCAP 测频
F28335共有6组eCAP模块,每个eCAP不但具有捕获功能,而且还可用作PWM输出功能.F28335捕获模块的主要特征如下: 1. 150MHz系统时钟的情况下,32位时基的时间分辨率为6.67n ...
- TypeError: reduction operation 'argmax' not allowed for this dtype
这个错误真的tmd伤脑筋.我用idxmax函数去求series类型的最大值的索引,结果明明是下面这种数据, 无论我如何pint他的shape,type,他怎么看都是一个满足idxmax函数要求的参数类 ...
- 模板中for 的使用
from flask import Flask,render_template app = Flask(__name__) app.config.update( DEBUG = True, ) @ap ...
- 创建可执行bin安装文件
[应用场景] 简化操作,对于有些安装操作而言,需要包含安装脚本和脚本需要的文件两部分,封装成可执行bin文件之后就只有一个安装包了. 代码保护,在很多情况下,我们并不希望用户可以直接接触到代码部分,这 ...
- HDU 1074 Doing Homework (状压DP)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- [Python3] 027 常用模块 time
目录 time 1. 时间戳 2. UTC 时间 3. 夏令时 4. 时间元组 5. 举例 5.1 例子1 例子2 例子3 例子4 例子5 例子6 例子7 time 1. 时间戳 一个时间表示,根据不 ...
- 几张图让你看懂WebAssembly
几张图让你看懂WebAssembly:https://www.jianshu.com/p/bff8aa23fe4d
- hibernate-HQL连接查询 转载sincoolvip
和SQL查询一样,HQL也支持各种各样的连接查询,如内连接.外连接 连接类型 HQL语法内连接 inner join 或者join迫切内连接 inner join fetch 或join fetch左 ...
- allure 这么高大上的测试报告环境,5 分钟搞定
allure 的测试报告是老板喜欢的样子.如果能用上 allure,干嘛还选择其他的测试报告类型呢?python 的 pytest 单元测试框架有 allure 的插件,可以很方便的在 python ...