# 同步 提交一个任务之后要等待这个任务执行完毕
# 异步 只管提交任务,不等待这个任务执行完毕就可以做其他事情
# 阻塞 recv recvfrom accept
# 非阻塞
# 阻塞 线程 运行状态 --> 阻塞状态 --> 就绪
# 非阻塞
# IO多路复用
# select机制 Windows linux 都是操作系统轮询每一个被监听的项,看是否有读操作
# poll机制 linux 它可以监听的对象比select机制可以监听的多
# 随着监听项的增多,导致效率降低
# epoll机制 linux
server:
import socket sk = socket.socket() sk.bind(('127.0.0.1',9000)) sk.setblocking(False) sk.listen() conn_l = [] del_conn = [] while True: try: conn,addr = sk.accept() #不阻塞,但是没人连我会报错 print('建立连接了:',addr) conn_l.append(conn) except BlockingIOError: for con in conn_l: try: msg = con.recv(1024) # 非阻塞,如果没有数据就报错 if msg == b'': del_conn.append(con) continue print(msg) con.send(b'byebye') except BlockingIOError:pass for con in del_conn: con.close() conn_l.remove(con) del_conn.clear() # while True : 10000 500 501
client:
import time import socket import threading def func(): sk = socket.socket() sk.connect(('127.0.0.1',9000)) sk.send(b'hello') time.sleep(1) print(sk.recv(1024)) sk.close() for i in range(2): threading.Thread(target=func).start()
如果一个列表是空的,for循环是不会执行的