io

发布时间 2023-09-27 16:23:02作者: 朱饱饱

server.py:
import socket #通信模块
server=socket.socket()
server.bin('127.0.0.1',8080)
server.listen(5)
server.setblocking(False)#设置阻塞 将网络阻塞变为非阻塞
r_list=[] #通信对象
while True: #通信循环
try: #捕捉以下异常
conn,addr= server.accept() #看有没有人来找他,没有就会出异常返回
r_list.append(conn)
except BlockingIOError as e: #没有来就捕捉到异常
print('列表的长度':len(r_list))
print('做其他事')#没有人来找就一直做其他事


client.py:
import socket 通信模块
client=socket.socket()
client.connect(('127.0.0.1',8080))
当client来了客户
while True:
client.send(b'hello world')
data=client.recv(1024)
print (data)

 


非阻塞io模型代码演示:实现并发捕获异常实际当中不会考虑

客户端:client.py:
import socket 通信模块
client=socket.socket()
client.connect(('127.0.0.1',8080))
当client来了客户
while True:
client.send(b'hello world')
data=client.recv(1024)
print (data)

 

3.io多路复用:
服务端:
可以帮我们监管conn,addr(就是server.accept()当别人给我发消息连完之后建立双向通道监管) 和server(就是socket.socket()当客户端来连的时候帮监管)
import socket
import select 自带 不用导
server=socket.socket()
server.bin('127.0.0.1',8080)
server.listen(5)
server.setblocking(False)#设置阻塞 将网络阻塞变为非阻塞
read_list=[server]
while True:
r_list,w_list,x_list=select.select(read_list,[],[])
#需要三个参数 等待直到可以读rlist 等待写 wlist
我们只需要一个参数读rlist,其余两个创个空列表就行,帮我们监测read_list
#print(res)帮我们监管,一旦有人来了就给我们说 并且显示元祖形式中间三个列表
for i in r_list:
#针对不同的对象做不同的处理,里面有server和i两个对象
if i is server:
conn,addr=i.accept()
#也应该添加到监管的队伍中
read_list.append(conn)
else:
res=i.recv(1024)
if len (res)==0:
i.close()
将无效的监管对象移除
read_list.remove(i)
continue
print(res)
i.send(b'hahaha')


客户端:
import socket


client=socket.socket()
client.connect(('127.0.0.1',8080))


while True:
client.send(b'hello world')
data=client.recv(1024)
print (data)

总结:监管技术其实有很多
select机制:双平台都有

poll机制:只在Linux有,poll和select都可以监管多个对象,但是poll监管的数量更多
上述select和poll机制都不是很完美
epoll机制:只在Linux有,他给每一个监管对象都绑定一个回调机制,一旦有响应,回调机制立刻发起提醒


4.异步io 实现异步
异步io模型是所有模型中效率最高,也是使用最广泛的
相关的模型和框架:
异步框架:sanic tronado taisred
速度快
import threading
import asyncio只会用框架不会用这个异步

@asyncio.coroutine
def hello():
print('helloworld%s'%threading.current_thread)
看一下线程号
yield from asyncio.sleep(1)换成真正的io操作
print('helloworld%s' % threading.current_thread)
loop=asyncio.get_event_loop()
拿到这个事件帮我监管,yield。。。。。sleep(1)
tasks=[hello(),hello()]
loop.run_until_complete(asyncio.wait(tasks))
起来直到这些任务全部完成
loop.close()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


服务端: