• IO模型


    阻塞IO

    • 阻塞等待接收数据后从操作系统内存copy到应用程序内存

    非阻塞IO

    • 循环去询问操作系统是否接收到了数据
    • 单线程下实现了并发,但过于消耗系统资源

    IO多路复用

    使用python内置模块select实现socket IO多路复用:

    • Server
    import socket
    import select
    
    sk = socket.socket()
    sk.bind(('127.0.0.1',8080))
    sk.setblocking(False)
    sk.listen(5)
    
    read_lst = [sk]
    
    while True:
    	r_lst,w_lst,x_lst = select.select(read_lst,[],[])
    	for i in r_lst:
    		if i is sk:
    			conn,addr = i.accept()
    			read_lst.append(conn)
    		else:
    			ret = i.recv(1024)
    			if ret == b'':
    				i.close()
    				read_lst.remove(i)
    				continue
    			print(ret)
    			i.send(b'goodbye!')
    
    
    • Client
    import socket
    import time
    from threading import Thread
    
    def func():
    	sk = socket.socket()
    	sk.connect(('127.0.0.1',8080))
    	sk.send(b'hello')
    	time.sleep(3)
    	print(sk.recv(1024))
    
    
    if __name__ == '__main__':
    	for i in range(20):
    		t = Thread(target=func)
    		t.start()
    

    IO多路复用机制

    • select机制:windows ,liunx
    • poll 机制 :liunx 可监听的对象比select机制可以监听的多
      • select与poll机制都是操作题哦那个循环每一个监听的项,看看是否有读操作,随着监听项增多,导致效率低下
    • epoll 机制:liunx,MacOS
      • 绑定一个回调函数,一旦有连接便调用回调函数
    • selectors模块:自动选择合适的机制

    异步IO

    • 程序给操作系统发送一个信号,操作系统等待收到信息,收到信息后从操作系统内存拷贝到应用程序内存,在操作系统等待的这时间里,应用程序在做其他的事,等待数据与copy数据都是操作系统的事
  • 相关阅读:
    B端产品经理的价值
    APP场景流程分析
    大众点评
    降低成本
    抽象不变的,可变的
    优惠券统计报表
    JSON WEB TOKEN
    vue开发项目的坑-[Vue warn]: Do not use built-in or reserved HTML elements as component id: MenuItem
    redis分布式锁和消息队列
    thinkphp 面向切面编程-行为拓展
  • 原文地址:https://www.cnblogs.com/wualin/p/9968433.html
Copyright © 2020-2023  润新知