首页 > 其他 > 详细

IO模型

时间:2019-05-23 00:15:43      阅读:126      评论:0      收藏:0      [点我收藏+]
同步:提交一个任务后要等待这个任务执行完毕
异步:只管提交任务,不等待这个任务执行完毕就可以做其他事情
阻塞:recv recvfrom accept
# 阻塞:线程一旦阻塞就会从运行状态——>阻塞状态——>就绪状态
非阻塞:直接执行

IO多路复用:
    操作系统轮循每一个被监听的项,看是否有读操作
      select机制  windows linux  
      poll机制   linux  它可以监听的对象比select机制可监听的多

    通过回调函数来实施监听,效率非常高
      epoll机制   linux
非阻塞IO模型

以socket server为例
技术分享图片
import socket
sk = socket.socket()
sk.bind((127.0.0.1,8080))
sk.listen(0)
sk.setblocking(False)   # 把socket当中所有需要阻塞的方法都改变成非阻塞:recv,recvfrom,accept
conn_lst = []           # 用来储存所有请求来请求server端的conn连接
del_lst = []            # 用来存储所有已经断开与server端连接的conn
while True:
    try:
        conn,addr = sk.accept()     # 非阻塞,但是没人连接会报错
        print(建立连接,addr)
        conn_lst.append(conn)
    except BlockingIOError:
        for con in conn_lst:
            try:
                msg = con.recv(1024)        # 非阻塞,没有数据会报错
                if msg == b‘‘:
                    del_lst.append(con)
                    continue
                print(msg)
                conn.send(bbye)
            except BlockingIOError:pass
        for con in del_lst:
            conn.close()
            conn_lst.remove(con)
        del_lst.clear()
server
技术分享图片
import socket
import time
import threading
def func():
    sk = socket.socket()
    sk.connect((127.0.0.1,8080))
    time.sleep(0.1)
    sk.send(bhello)
    print(sk.recv(1024))
    sk.close()

for i in range(2):
    threading.Thread(target=func).start()
client

 

IO多路复用模型

技术分享图片
import select
import socket

sk = socket.socket()
sk.bind((127.0.0.1,8080))
sk.setblocking(False)
sk.listen(5)

read_lst = [sk]
while True:     # [sk,conn]
    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(bhi)
server
技术分享图片
import socket
import time
import threading
def func():
    sk = socket.socket()
    sk.connect((127.0.0.1,8080))
    sk.send(bhello)
    time.sleep(1)
    print(sk.recv(1024))
    sk.close()

for i in range(10):
    threading.Thread(target=func).start()
client

 

IO模型

原文:https://www.cnblogs.com/Mr-Feng/p/10909395.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!