回覆列表
  • 1 # 使用者7262552914985

    同步不同步,阻塞不阻塞,這兩個概念是互相獨立的(orthogonal),也就是說他們一共可以搞出來四種情況:

    同步+阻塞:程式程式碼一行一行執行,上一行不執行完,下一行就不會被執行;如果上一行卡住了遲遲不結束(阻塞了),那麼整塊程式碼全部卡住。遇到這種程式碼的感覺就是程式突然卡住宕機,小圈圈來回轉,此時使用者無法區分電腦是在冥想還是掛了,所以體驗非常差。同步+非阻塞:這就是最常見的程式,一行一行序貫執行,且沒有哪一行會出現卡死的情況。這種程式最符合人們對計算機程式的心理預期,也就是程式能做到“有問立答”。非同步+阻塞:雖然程式碼中某些部分會卡住,但是由於採用了非同步的處理方式(包括callback、future、promise、reactiveX、async-await/coroutine),所以卡住行的下一行不會傻等,整個程式碼塊也就不會卡住。這時雖然做不到有問立答,但是會給你一張小卡片上面寫著“已受理,請稍等”,這種體驗也不會太差。非同步+非阻塞:非阻塞情況下一般不會採用非同步程式設計,這個組合屬於脫褲子放屁。但是在兼有阻塞非阻塞的程式碼塊中,由於整塊都可能採用非同步程式設計,所以也會出現這種組合。體驗上講也是有問立答,只是會稍稍慢一點,但感覺不出來。

    一般來說,先看程式碼中有沒有阻塞的部分,如果有阻塞了那就要立即考慮是不是上非同步,也就是選取一種非同步正規化(callback、future、promise、reactiveX、async-await/coroutine)來重寫程式碼。在Vert.x中的判斷阻塞的標準是,任何一個呼叫必須2秒內返回結果,一旦超時就認為這段程式碼是阻塞的,也就是要變成非同步。

    所以上面4個組合中,“非同步+阻塞“是最需要吃透的。

    ---------------

    補充:評論中有朋友認為絕大多數程式是“同步+阻塞”的,這個是因為阻不阻塞的標準不同。首先,我說的阻塞一般是使用者體驗上的概念,不是指程式是否瞬時返回。按vert.x的標準,2s內返回可認為阻塞得不嚴重,或乾脆認為不阻塞。互動loop中的一條程式碼只允許延時2s,這個比較明顯是人為選取的閾值,更多是防止心理上進入“叫天天不應”的焦慮狀態。從這層意義上來講,絕大部分的程式都是假定程式碼不產生使用者體驗上的阻塞,同時採用同步的方式去程式設計。這也是為什麼我說絕大部分的程式碼都是“同步+非阻塞”的。感謝評論。

  • 中秋節和大豐收的關聯?
  • 印度有一家印地語報刊,名為Navbharat Times,這裡的Navbharat是什麼意思?