同步:提交一个任务后要等待这个任务执行完毕
异步:只管提交任务,不等待这个任务执行完毕就可以做其他事情
阻塞: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(b‘bye‘) except BlockingIOError:pass for con in del_lst: conn.close() conn_lst.remove(con) del_lst.clear()
import socket import time import threading def func(): sk = socket.socket() sk.connect((‘127.0.0.1‘,8080)) time.sleep(0.1) sk.send(b‘hello‘) print(sk.recv(1024)) sk.close() for i in range(2): threading.Thread(target=func).start()
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(b‘hi‘)
import socket import time import threading def func(): sk = socket.socket() sk.connect((‘127.0.0.1‘,8080)) sk.send(b‘hello‘) time.sleep(1) print(sk.recv(1024)) sk.close() for i in range(10): threading.Thread(target=func).start()
原文:https://www.cnblogs.com/Mr-Feng/p/10909395.html