非阻塞的socket
同步和异步的概念描述的是用户线程与内核的交互方式:同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行;而异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数。
阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式:阻塞是指IO操作需要彻底完成后才返回到用户空间;而非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。
有三种io方式
blocking IO: 发起IO操作后阻塞当前线程直到IO结束,标准的同步IO,如默认行为的posix read和write。
non-blocking IO: 发起IO操作后不阻塞,用户可阻塞等待多个IO操作同时结束。non-blocking也是一种同步IO:“批量的同步”。如linux下的poll,select, epoll,BSD下的kqueue。
asynchronous IO: 发起IO操作后不阻塞,用户得递一个回调待IO结束后被调用。如windows下的OVERLAPPED + IOCP。linux的native AIO只对文件有效。
1.非阻塞IO
from socket import *
import time
#用来存储所有的新链接socket
g_socket_list = list()
def mian():
server_socket = socket(AF_INET,SOCK_STREAM)
server_socket.setsockopt(SOL_SOCKET,SO_REUSEADDR,True)
server_socket.bind(('',7890))
server_socket.listen(128)
server_socket.setblocking(False)
while True:
# time.sleep(0.1)
try:
newClientInfo = server_socket.accept()
except Exception as result:
print(result)
else:
print('一个新的客户端到来',str(newClientInfo))
newClientInfo[0].setblocking(False)#切换为非阻塞
g_socket_list.append(newClientInfo)
for clien_socket,client_addr in g_socket_list:
try:
recvData = clien_socket.recv(1024)
if recvData:
print('客户端已关闭',client_addr)
clien_socket.close()
g_socket_list.remove((clien_socket,client_addr))
except Exception as result:
print(result)
pass
print(g_socket_list)
if