boost.asio

先来了解了解阻塞/非阻塞,同步/异步

一、核心概念解析

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
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    2301_80355452

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值