先来了解了解阻塞/非阻塞,同步/异步
一、核心概念解析
1. 同步 vs 异步
关注点:任务完成的“通知方式”。
-
同步(Synchronous):调用者必须主动等待任务完成结果。
-
类比:你去餐厅点餐后,必须站在柜台前等餐做好,期间不能做其他事。
-
-
异步(Asynchronous):调用者发起任务后不需要等待,任务完成后通过回调、事件等方式通知调用者。
-
类比:你点餐后拿到取餐号,可以去玩手机,餐好了服务员会叫号通知你。
-
2. 阻塞 vs 非阻塞
关注点:调用者等待时的“状态”。
-
阻塞(Blocking):调用者发起操作后被挂起,直到操作完成才能继续执行。
-
类比:你在ATM机前排队,必须等到前面的人全部操作完才能轮到你。
-
-
非阻塞(Non-Blocking):调用者发起操作后立即返回,可以继续执行其他代码,通过轮询或事件监听结果。
-
类比:你在餐厅扫码点单后,每隔5分钟去问服务员“餐好了吗?”(轮询),期间可以刷手机。
-
二、四种组合模型
1. 同步阻塞(Sync-Blocking)
-
特点:调用后必须等待结果,期间线程被挂起。
-
代码示例(Python Socket):
# 客户端连接服务器(同步阻塞)
import socket
sock = socket.socket()
sock.connect(("www.example.com", 80)) # 阻塞直到连接成功
data = sock.recv(1024) # 阻塞直到收到数据
-
生活比喻:打电话给客服,必须一直听等待音乐,直到客服接听。
2. 同步非阻塞(Sync-NonBlocking)
-
特点:调用后立即返回,需手动轮询检查结果。
-
代码示例:
sock.setblocking(False) # 设置为非阻塞模式 try: data = sock.recv(1024) # 立即返回,无数据则抛异常 except BlockingIOError: # 数据未就绪,继续做其他事情
-
生活比喻:每隔10秒查看一次快递物流信息(主动轮询)。
3. 异步非阻塞(Async-NonBlocking)
-
特点:调用后立即返回,通过回调或事件通知结果。
-
代码示例(Python asyncio):
import asyncio async def fetch_data(): reader, writer = await asyncio.open_connection("www.example.com", 80) writer.write(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n") await writer.drain() # 非阻塞等待发送完成 dat