网络:IO

1、IO

  input output,IO就是输入输出

  在内存中存在数据交换的操作可以认为是IO操作(输入输出)

  eg:

    【1】内存和磁盘进行数据交换:

        文件的读写, 数据库更新

    【2】内存和终端数据交换 :

        input 、print

        sys.stdin、 sys.stdout、 sys.stderr

    【3】内存和网络数据的交换:

        网络连接, recv、 send、 recvfrom等

2、IO密集型程序与CPU(计算)密集型程序

  【1】IO密集型程序 :

      程序执行中有大量的IO操作,而较少的cpu 运算操作。消耗cpu较少,IO运行时间长

  【2】CPU(计算)密集型程序:

      程序中存在大量的cpu运算,IO操作相对较少,消耗cpu大。

3、IO分类

  阻塞IO 、非阻塞IO 、IO多路复用、 事件驱动IO 、异步IO

  【1】阻塞IO :

      程序运行中遇到IO条件没有达成或者传输过从较慢的情况会出现阻塞状态

      ① 阻塞IO是 IO最简单的逻辑情形,也是默认状态

      ②  阻塞IO是效率很低的IO形态

      【阻塞情况】 

         ① 因为某种IO条件没有达到形成阻塞

            eg: accept、 recv、 recvfrom、 input

         ② 处理IO事件的时候耗时较长形成阻塞

            eg: 文件读写过程, 网络数据发送过程

  【2】非阻塞IO :

      在程序运行中遇到IO的情形不让其产生阻塞

      【实现手段】

         ①  改变IO事件的属性,使其变为非阻塞 

         ② 通常会和循环一起使用,尽心条件的循环监控

         sock.setblocking(False)

         功能 : 将套接字设置为非阻塞

         参数 : 默认True,为阻塞状态。设置为False则为非阻塞

      【套接字超时检测 】

          将原本阻塞的函数,设置一个阻塞的最长时间。

          在时间内如果仍然阻塞则不再等待

          sock.settimeout(sec)

          参数 : 时间 (秒)

          功能 : 设置套接字的超时时间 

from socket import *
import time 

s = socket()
s.bind(('127.0.0.1',8888))
s.listen(5)

#将IO设置为非阻塞
s.setblocking(False)


while True:
    print("Waiting for connect...")

    try:
        c,addr = s.accept()
    except BlockingIOError:
        time.sleep(2)
        print(time.ctime())
        continue

    print("Connect from",addr)
    # c.setblocking(False)
    while True:
        data = c.recv(1024).decode()
        if not data:
            break
        print(data)
    c.close()

s.close()
False-block-server
from socket import * 

#创建套接字
sockfd = socket()

#发起连接
sockfd.connect(('127.0.0.1',8888))

while True:
    #消息收发
    msg = input("Msg>>")
    if not msg:
        break
    sockfd.sendall(msg.encode())
    data = sockfd.recv(1024)
    print(data.decode())

sockfd.close()
tcp-client

  【3】IO多路复用

      通过一个监测,可以同时监控多个IO事件,

      当哪个IO事件可以执行,即让这个IO事件发生,这就是IO多路复用

      【IO事件就绪】

        IO事件即将发生的一个临界状态

        ① 在程序中存在的IO事件中选择要监测的

        ② 创建监测,将监测的IO事件注册

        ③ 等待监测的IO时间发生,判断是什么IO事件

        ④ 处理相应的IO

      【多路复用的实现】

        https://www.cnblogs.com/longyuu/p/14234690.html

        select模块。

        select() ---> windows linux unix

        poll() ---> linux unix

        epoll() ---> linux unix

 

  【4】

  【5】

 

posted @ 2021-01-05 13:48  昱成  阅读(263)  评论(0编辑  收藏  举报