热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

〖Python〗socket+select实现构建异步非阻塞模块

【socketselect实现构建异步非阻塞模块】对于异步IO请求的本质则是【非阻塞Socket】【IO多路复用】,那我们是否可以自定义异步IO模块,作

【socket + select 实现构建异步非阻塞模块】

对于异步IO请求的本质则是【非阻塞Socket】+【IO多路复用】,那我们是否可以自定义异步IO模块,作为客户端,用于发送请求呢?答案那是肯定的!

补充说明:select可操作任何对象,但对象内必须是有fileno方法,可以看作是一个数值,给系统提供(文件句柄),其内部执行的是socket对象fileno方法的返回值!

自定义一个插件,模块如下:

import socket
import selectclass Request(object):"""select监听的是有变化的对象,当多个socket通信存在的话,当发生变化时,无法确定哪个是哪个。此时就需要唯一指定哪个通信处理的是什么数据!我们想到的办法是,再另创建一个类,用于接收当前的socket和信息,实例化唯一的对象!巧妙之处就在于唯一化的处理,生成的每个对象都是唯一的!!!"""def __init__(self,sock,info):#初始化self.sock = sock 通信self.info = info 信息def fileno(self): #转换成fileno对象return self.sock.fileno()class NoBlockIO(object):def __init__(self):self.sock_list = []self.conns = []def add_request(self,req_info):"""创建请求假设:req_info = {'host': 'www.baidu.com', 'port': 80, 'path': '/'},:return:"""sock = socket.socket() #创建socket对象sock.setblocking(False) #设置为非阻塞#建立连接,因为是非阻塞状态,连接可能会出异常所以需要做异常处理。#此处一定要注意,不管报不报错,连接的请求肯定会发出!try:sock.connect((req_info['host'],req_info['port']))except BlockingIOError as e:pass#实例化唯一的通信对象obj = Request(sock,req_info) #将生成的sock对象和信息列表传递到Request类,然后获取对应的文件句柄,信息保留到self.sock_list.append(obj) #将得到的对象添加到sock_list 通信列表中self.conns.append(obj) #将得到的对象添加到conns 连接列表中def run(self):"""开始事件循环,检测:连接成功?数据是否返回?注意此处操作的就全是Request类生成的对象!!!:return:"""while True:# select.select([request对象,])r,w,e = select.select(self.sock_list,self.conns,[],0.05)# w,是否连接成功for obj in w:# 检查obj:request对象是谁,此时就需要唯一判断了!利用类可以封装对象的特性解决!# socket, {'host': 'www.baidu.com', 'port': 80, 'path': '/'},data = "GET %s http/1.1\r\nhost:%s\r\n\r\n" %(obj.info['path'],obj.info['host']) #发送GET请求的信息obj.sock.send(data.encode('utf-8')) #连接成功,发送字节数据self.conns.remove(obj) #然后在连接列表中删除这个对象,防止发送两次,排除循环通信的可能# 数据返回,接收到数据for obj in r:response = obj.sock.recv(8096) #成功接收到数据,接收返回的信息#单个回调函数obj.info['callback'](response) #指定对应对象执行回调函数,参数为返回的信息#多个回调函数的情况!#for func in obj.info['callback'] #指定对应对象执行回调函数,参数为返回的信息# func(response)
self.sock_list.remove(obj) #在监听列表中移除这个对象# 所有请求已经返回if not self.sock_list: #所有请求都处理完,就退出循环break

NBIO

调用这个插件,使用插件里的方法:

from .NBIO import NoBlockIO#自定义定义回调函数,对返回的信息进行处理(执行完毕之后,对数据进行什么操作)
def done1(response):print(response)def done2(response):print(response)#准备执行的信息,域名,端口号,回调函数
url_list = [{'host': 'www.baidu.com', 'port': 80, 'path': '/','callback': done1},{'host': 'www.cnblogs.com', 'port': 80, 'path': '/index.html','callback': done2},{'host': 'www.bing.com', 'port': 80, 'path': '/','callback': done2},
]
#实例化一个对象
noblockObj = NoBlockIO()#循环要处理的信息
for item in url_list:noblockObj.add_request(item) #为条信息创建请求

noblockObj.run()
#执行
#
谁先执行完就返回谁,相对独立,互不干扰!

执行脚本

异步是相对而言,需要时间循环去检测!
以上是简单的模块定制,更多的操作,例如:分割响应头,响应体;or 保存文件这些操作后续需要,再进行补充!

 

慎重说明:必须知道和理解整个执行的流程!!!

 

转:https://www.cnblogs.com/SHENGXIN/p/7684481.html



推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
author-avatar
无心之无心
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有