异步io模块
'''客户端'''
import socket,select
#####进行封装,将socket对象和要返回的url,和回调函数进行一下封装
class Httprequest():
def __init__(self,sk,host,callback):
self.socket=sk
self.host=host#####这个host就是www.baidu.ocm,根据这个域名可以获取到相对应的ip出来
self.callback=callback
##不一定是socket,只要在监听的对象里面可以有fileno方法,并且可以返回socket对象里面的文件描述符就可以
def fileno(self):
return self.socket.fileno()
###只要监听的对象里面的fileno方法返回的是文件描述符就可以放在select里面 class Main():
def __init__(self):
self.conn=[]
self.conection=[] def add_request(self,host,callback):##########传到里面来
try:
sk = socket.socket()##创建socket对象
sk.setblocking(False)
# sk.accept()
sk.connect((host, 80,)) # self.conection.append(sk)
except BlockingIOError as e:
pass
#########进行下面的封装的操作
request = Httprequest(sk, host, callback)
# self.conn.append(sk)
self.conn.append(request)
self.conection.append(request)
print(self.conn)
print(self.conection) def create(self):
rlist,wlist,elist=select.select(self.conn,self.conection,self.conn,0.05)###第一个监听的是建立通信的socket对象,第二个监听的是建立连接的socket的对象,第三个是发生异常的socket对象,最后一个是最多延迟多少秒
for socket_obj in wlist:
data = 'GET / HTTP/1.0/r/nHost:%s\r\n\r\n' % (socket_obj.host)#####注意一下格式问题
socket_obj.socket.send(bytes(data, encoding='utf-8'))##注意是里面封装好的socket发送数据过来
####注意,发送数据是以字节得形式发送过去
self.conection.remove(socket_obj) #############下面是开始进行通信的socket对象
for r in rlist:
chunks = bytes() ###设置全部的chunk数据
try:
while True:
chunk = r.socket.recv(8096)
chunks += chunk######可以对接受的数据进行处理
except Exception as e:
print(e)##有数据就去拿数据,没有数据就会保错
print('有数据返回',chunks)#####拿到返回的全部的数据,每一个socket拿到的通行之间的数据
r.callback(chunks)#############调用这个r里面的callback函数,进行保存数据等操作
r.socket.close()
self.conn.remove(r)#####这个r是socket对象,wlist,rlist里面的都是socket对象,这个socket是封装好的,有url,socket,callback,可以直接进行调用
if len(self.conn)==0:
break def f1(chunks):##可以对接收到的数据进行保存在数据等操作
print('运行fun1') def f2(chunks):
print('运行fun2') def f3(chunks):
print('运行fun3') url_list=[
{'host':'www.baidu.com','callback':f1},
{'host':'www.baidu.com','callback':f2},
{'host': 'www.baidu.com', 'callback':f3},
] req=Main()
for item in url_list:
req.add_request(item['host'],item['callback'])
req.create()
异步io模块的更多相关文章
- python---爬虫相关性能(各个异步模块的使用,和自定义异步IO模块)
一:线程池,进程池等相关文章了解 python---基础知识回顾(十)进程和线程(py2中自定义线程池和py3中的线程池使用) python---基础知识回顾(十)进程和线程(协程gevent:线程在 ...
- python的异步IO模块
asyncio模块:示例一 import asyncio @asyncio.coroutine def func1(): print('before...func1......') yield fro ...
- python之爬虫_并发(串行、多线程、多进程、异步IO)
并发 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢 import requests def fetch_async(url): res ...
- python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)
昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...
- {python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) IO模型比较分析 selectors模块
python之IO多路复用 阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 ...
- (IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)
参考博客: https://www.cnblogs.com/xiao987334176/p/9056511.html 内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yi ...
- python全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)
昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...
- Python学习---IO的异步[tornado模块]
tornado是一个异步非阻塞的WEB框架.它的异步非阻塞实际上就是用事件循环写的. 主要体现在2点: 1. 作为webserver可以接收请求,同时支持异步处理请求.Django只能处理完成上一个请 ...
- Python学习---IO的异步[asyncio模块(no-http)]
Asyncio进行异步IO请求操作: 1. @asyncio.coroutine 装饰任务函数 2. 函数内配合yield from 和装饰器@asyncio.coroutine 配合使用[固定格式 ...
随机推荐
- java运维: 一次线上问题排查所引发的思考
本文转载自 crossoverJie 的b博客 https://www.cnblogs.com/crossoverJie/p/9282065.html 前言 之前或多或少分享过一些内存模型.对象创建之 ...
- oracle 对对表匹配的进行修改匹配不上的可以进行新增 (MERGE INTO)
MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句. 通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询, 连接条件匹配上的进行UPDATE,无法匹配 ...
- Java SE之正则表达式六:匹配规则
注释: 1.[]表示的字符集,不表示包含 ()表捕获和成组 Eg: 只能是QQ邮箱/GMail邮箱/Outlook邮箱/163邮箱之一 (qq|gmail|163){1}\.com 与 [(qq)|( ...
- Python之线程 1 - 线程基本概念
一 背景知识 1.进程 2.有了进程为什么还要线程 3.线程的出现 二 线程和进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 1.用户级线程 ...
- 第26月第8天 android studio 国内
1. //东软信息学院 mirrors.neusoft.edu.cn 80 使用方法: 启动 Android SDK Manager ,打开主界面,依次选择「Tools」.「Options…」,弹 ...
- 第20月第9天 paddlepaddle
1. http://staging.paddlepaddle.org/docs/develop/book/02.recognize_digits/index.cn.html
- LOJ #2026「JLOI / SHOI2016」成绩比较
很好的锻炼推柿子能力的题目 LOJ #2026 题意 有$n$个人$ m$门学科,第$ i$门的分数为不大于$U_i$的一个正整数 定义A「打爆」B当且仅当A的每门学科的分数都不低于B的该门学科的分数 ...
- linux 共享内存的理解
1. 共享内存是在shmget时创建出来的, 在 shmget(USER_SHARE_MEM_KEY, sizeof(ADDR_NODE) , IPC_CREAT|0666)) ==-1) 的 s ...
- Create C++ Class
创建“目标物体”,是世界场景中的一个物体,当玩家经过时,可以将它拾起,并带至某处 选择Actor为父类,创建FPSObjectiveActor类 注:点击公有按钮就会把头文件放入Public文件夹 ...
- 【多线程补充】SimpleDateFormat非线程安全与线程中、线程组中异常的处理
1.SimpleDateFormat非线程安全的问题 类SimpleDateFormat主要负责日期的转换与格式化,但在多线程环境中,使用此类容易造成数据转换及处理的不正确,因为SimpleDateF ...