004---IO模型

io模型

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

  • 同步:發出一個功能調用時,在沒有獲得結果以前,該調用就不會返回,原地等待多線程

  • 異步:相反,不須要等待異步

  • 阻塞:調用結果返回以前,當前線程會被掛起,如io操做,只有在獲得返回結果以後,纔會將阻塞的線程激活和同步不同,不要混淆,同步雖然也在原地等待,可是它的線程仍是激活的。socket

  • 非阻塞 相反函數

總結:

  • 同步與異步針對的是函數/任務的調用方式:同步就是當一個進程發起一個函數(任務)調用的時候,一直等到函數(任務)完成,而進程繼續處於激活狀態。而異步狀況下是當一個進程發起一個函數(任務)調用的時候,不會等函數返回,而是繼續往下執行當,函數返回的時候經過狀態、通知、事件等方式通知進程任務完成。
  • 阻塞與非阻塞針對的是進程或線程:阻塞是當請求不能知足的時候就將進程掛起,而非阻塞則不會阻塞當前進程

IO模型

  • 阻塞IO:socket默認是阻塞的線程

    解決方案:使用多線程或多進程,可是問題是若是鏈接數太多,會嚴重佔用計算機資源使用線程池或進程池,只是必定程度上緩解了,可是池子始終有上限。。。因此仍是用非阻塞吧。server

  • 非阻塞IO:用戶進程實際上是須要不斷的主動詢問kernel數據準備好了沒有。進程

    server.setblocking(False)事件

    弊端:循環調用recv()將大幅度cpu佔用率。檢測操做是否完成,毫不被推薦資源

  • 多路複用IO:事件驅動模型
    select 代替咱們去詢問,至關於中介處理的鏈接數不是很高,還不如以前的,可是若是鏈接數很是大,效果顯而易見的。同步

相關文章
相關標籤/搜索