zoukankan      html  css  js  c++  java
  • 阻塞IO和非阻塞IO的区别与io多路复用

    读:

      在阻塞条件下,如果没有发现数据在网络缓冲中会一直等待,当发现有数据的时候会把数据读到用户指定的缓冲区。但是如果这个时候读到的数据量比较少,比参数中指定的长度要小,
    read并不会一直等待下去,而是立刻返回。read的原则是数据在不超过指定的长度的时候有多少读多少,没有数据就会一直等待。所以一般情况下我们读取数据都需要采用循环读的方式读取数据,
    一次read完毕不能保证读到我们需要长度的数据,read完一次需要判断读到的数据长度再决定是否还需要再次读取。  在非阻塞的情况下,read的行为是如果发现没有数据就直接返回,如果发现有数据那么也是采用有多少读多少的进行处理.对于读而言,阻塞和非阻塞的区别在于没有数据到达的时候是否立刻返回。

    写:

      在阻塞的情况,是会一直等待直到write完全部的数据再返回。
      非阻塞写的情况,是采用可以写多少就写多少的策略。
    

    io多路复用

    # 在并发高的情况下,连接活跃度不是很高, epoll比select
    # 并发性不高,同时连接很活跃, select比epoll好

    #通过非阻塞io实现http请求
    
    import socket
    from urllib.parse import urlparse
    
    
    #使用非阻塞io完成http请求
    
    def get_url(url):
        #通过socket请求html
        url = urlparse(url)
        host = url.netloc
        path = url.path
        if path == "":
            path = "/"
    
        #建立socket连接
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client.setblocking(False)
        try:
            client.connect((host, 80)) #阻塞不会消耗cpu
        except BlockingIOError as e:
            pass
    
        #不停的询问连接是否建立好, 需要while循环不停的去检查状态
        #做计算任务或者再次发起其他的连接请求
    
        while True:
            try:
                client.send("GET {} HTTP/1.1
    Host:{}
    Connection:close
    
    ".format(path, host).encode("utf8"))
                break
            except OSError as e:
                pass
    
    
        data = b""
        while True:
            try:
                d = client.recv(1024)
            except BlockingIOError as e:
                continue
            if d:
                data += d
            else:
                break
    
        data = data.decode("utf8")
        html_data = data.split("
    
    ")[1]
        print(html_data)
        client.close()
    
    if __name__ == "__main__":
        get_url("http://www.baidu.com")
  • 相关阅读:
    常用知识点集合
    LeetCode 66 Plus One
    LeetCode 88 Merge Sorted Array
    LeetCode 27 Remove Element
    LeetCode 26 Remove Duplicates from Sorted Array
    LeetCode 448 Find All Numbers Disappeared in an Array
    LeetCode 219 Contains Duplicate II
    LeetCode 118 Pascal's Triangle
    LeetCode 119 Pascal's Triangle II
    LeetCode 1 Two Sum
  • 原文地址:https://www.cnblogs.com/topass123/p/13298997.html
Copyright © 2011-2022 走看看