码迷,mamicode.com
首页 > 其他好文 > 详细

异步io模块

时间:2018-11-29 12:27:31      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:.so   enc   item   lock   封装   import   error   保存数据   异步   

‘‘‘客户端‘‘‘
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模块

标签:.so   enc   item   lock   封装   import   error   保存数据   异步   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!