异步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()

原文地址:https://www.cnblogs.com/yunxintryyoubest/p/10037228.html

时间: 2024-10-04 16:39:54

异步io模块的相关文章

Py修行路 socket + select 实现 异步IO模块

对于异步IO请求的本质则是[非阻塞Socket]+[IO多路复用],那我们是否可以自定义异步IO模块? 自定义一个插件,模块如下: import socket import select class Request(object): """ select监听的是有变化的对象,当多个socket通信存在的话,当发生变化时,无法确定哪个是哪个.此时就需要唯一指定哪个通信处理的是什么数据! 我们想到的办法是,再另创建一个类,用于接收当前的socket和信息,实例化唯一的对象! 巧妙

python---爬虫相关性能(各个异步模块的使用,和自定义异步IO模块)

一:线程池,进程池等相关文章了解 python---基础知识回顾(十)进程和线程(py2中自定义线程池和py3中的线程池使用) python---基础知识回顾(十)进程和线程(协程gevent:线程在I/O请求上的优化) python---异步IO(asyncio)协程 二:异步I/O模块的了解(同协程:线程在I/O请求上的优化) (一)asyncio模块的使用 1.使用简单实例 import asyncio,time async def func1(num): print(num,"befor

自定义异步IO模块开发

响应头和响应体是用两个换行分割的 sk.setblock(False) 不阻塞 host是IP  比如www.baidu.com也是host,IP地址也是 r,w,e=select.select() w是连接成功的socket对象 r是有数据返回的socket对象 IO多路复用:r,w,e=while 监听多个socket对象 异步IO:非阻塞的socket+IO多路复用 -非阻塞socket -select[自己对象],w,r 异步IO模块本身是一个线程同步,使用者是异步的 import so

异步IO模块的使用

gevent:mokey.path_all (找到所有socket,进行异步IO) gevent+requests=>grequests Twisted: reactor.run() 死循环 Tornado =>gevent > Twisted > Tornado > asyncio www.cnblogs.com/wupeiqi/articles/6229292.html """ import gevent import requests fr

python的异步IO模块

asyncio模块:示例一 import asyncio @asyncio.coroutine def func1(): print('before...func1......') yield from asyncio.sleep(5) print('end...func1......') tasks = [func1(), func1()] loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.gather(*tasks

自定义异步IO模块前戏

1.setblocking(0):无数据(连接无响应:数据未返回)就报错 2.IO多路复用 原文地址:https://www.cnblogs.com/jintian/p/11406564.html

python之自定义异步IO客户端

#!/usr/bin/env python # -*- coding: utf8 -*- # __Author: "Skiler Hao" # date: 2017/5/16 15:04 import select import socket import pprint """ 自定义了异步IO模块 利用非阻塞的socket,不等待连接是否成功,不等待请求的相应 select模块,去监听创建的套接字,是否有准备写,准备读的 ""&quo

python(十)下:事件驱动与 阻塞IO、非阻塞IO、IO多路复用、异步IO

上节的问题: 协程:遇到IO操作就切换. 但什么时候切回去呢?怎么确定IO操作完了? 一.事件驱动模型介绍 通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求: (2)每收到一个请求,创建一个新的线程,来处理该请求: (3)每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求 第三种就是协程.时间驱动的方式,一般普遍认为第(3)种方式是大多数网络服务器采用的方式 论事件驱动模型 在UI编程中,,常常要对鼠标点击进行相应,

异步io和协程

常见的异步io模块asyncio.gevent.twisted.tornado 核心技术为select()和协程 异步io请求的本质则是[非阻塞Socket]+[IO多路复用] 协程在这里不是一个必须使用的技术,在使用select()事件驱动循环本身就可以达到单线程异步的效果 io协程在遇到阻塞时进行切换,其实现需要依赖select()事件循环进行切换 协程本质是一种上下文切换技术,通过生成器yield记录状态的特性来实现 r,w,e = select.select([rlist],[wlist