1. 程式人生 > 其它 >python併發程式設計之並行和併發、同步和非同步、阻塞和非阻塞

python併發程式設計之並行和併發、同步和非同步、阻塞和非阻塞

1、什麼是併發和並行

並行: 就是在一個精確的時間片刻,兩者同時執行
併發: 是指資源有限的情況下,兩者交替輪流使用資源,在一個時間段上交替執行,看上去是同時進行

2、並行和併發的區別

並行是從微觀上,也就是在一個精確的時間片刻,有不同的程式在執行,這就要求必須有多個處理器。
併發是從巨集觀上,在一個時間段上可以看出是同時執行的,比如一個伺服器同時處理多個session。

3、什麼是同步和非同步

同步就是一個任務的完成需要依賴另外一個任務時,只有等待被依賴的任務完成後,依賴的任務才能算完成,這是一種可靠的任務序列。
非同步是不需要等待被依賴的任務完成,只是通知被依賴的任務要完成什麼工作,依賴的任務也立即執行,只要自己完成了整個任務就算完成了。
    至於被依賴的任務最終是否真正完成,依賴它的任務無法確定,所以它是不可靠的任務序列。

4、阻塞和非阻塞

阻塞和非阻塞這兩個概念與程式(執行緒)等待訊息通知(無所謂同步或者非同步)時的狀態有關。
  也就是說阻塞與非阻塞主要是程式(執行緒)等待訊息通知時的狀態角度來說的

5、同步/非同步和阻塞/非阻塞的形式

1.同步阻塞形式

  效率最低。拿上面的例子來說,就是你專心排隊,什麼別的事都不做。

2.非同步阻塞形式

  如果在銀行等待辦理業務的人採用的是非同步的方式去等待訊息被觸發(通知),也就是領了一張小紙條,
    假如在這段時間裡他不能離開銀行做其它的事情,那麼很顯然,這個人被阻塞在了這個等待的操作上面。

  非同步操作是可以被阻塞住的,只不過它不是在處理訊息時阻塞,而是在等待訊息通知時被阻塞。

3.同步非阻塞形式

  實際上是效率低下的。
  想象一下你一邊打著電話一邊還需要抬頭看到底隊伍排到你了沒有,如果把打電話和觀察排隊的位置看成是程式的兩個操作的話,
    這個程式需要在這兩種不同的行為之間來回的切換,效率可想而知是低下的。

4.非同步非阻塞形式

  效率更高
    因為打電話是你(等待者)的事情,而通知你則是櫃檯(訊息觸發機制)的事情,程式沒有在兩種不同的操作中來回切換。
    比如說,這個人突然發覺自己煙癮犯了,需要出去抽根菸,於是他告訴大堂經理說,排到我這個號碼的時候麻煩到外面通知我一下,
      那麼他就沒有被阻塞在這個等待的操作上面,自然這個就是非同步+非阻塞的方式了。

  很多人會把同步和阻塞混淆,是因為很多時候同步操作會以阻塞的形式表現出來,同樣的,
    很多人也會把非同步和非阻塞混淆,因為非同步操作一般都不會在真正的IO操作處被阻塞。