004---IO模型

io模型

同步、异步、阻塞、非阻塞概念

  • 同步:发出一个功能调用时,在没有得到结果之前,该调用就不会返回,原地等待

  • 异步:相反,不需要等待

  • 阻塞:调用结果返回之前,当前线程会被挂起,如io操作,只有在得到返回结果之后,才会将阻塞的线程激活和同步不一样,不要混淆,同步虽然也在原地等待,但是它的线程还是激活的。

  • 非阻塞 相反

总结:

  • 同步与异步针对的是函数/任务的调用方式:同步就是当一个进程发起一个函数(任务)调用的时候,一直等到函数(任务)完成,而进程继续处于激活状态。而异步情况下是当一个进程发起一个函数(任务)调用的时候,不会等函数返回,而是继续往下执行当,函数返回的时候通过状态、通知、事件等方式通知进程任务完成。
  • 阻塞与非阻塞针对的是进程或线程:阻塞是当请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程

IO模型

  • 阻塞IO:socket默认是阻塞的

    解决方案:使用多线程或多进程,但是问题是如果连接数太多,会严重占用计算机资源使用线程池或进程池,只是一定程度上缓解了,但是池子始终有上限。。。所以还是用非阻塞吧。

  • 非阻塞IO:用户进程其实是需要不断的主动询问kernel数据准备好了没有。

    server.setblocking(False)

    弊端:循环调用recv()将大幅度cpu占用率。检测操作是否完成,绝不被推荐

  • 多路复用IO:事件驱动模型
    select 代替我们去询问,相当于中介处理的连接数不是很高,还不如之前的,但是如果连接数非常大,效果显而易见的。

posted @ 2019-02-17 21:33  爬呀爬Xjm  阅读(104)  评论(0编辑  收藏  举报