併發-1-併發模型

並行工做者模式:

在並行工做者模式中,委派者接收到任務(如請求監聽線程),分發給工做者完成任務(如請求處理線程)。舉個例子,若是在汽車工廠執行該模式,包工頭(請求監聽線程)負責分發工做給工人(請求處理線程),每一個工人拿到圖紙以後,該工人從頭至尾負責整臺汽車的生產,可是同個工人可能負責多臺汽車的生產。當汽車工人手上有多臺車須要進行處理時,某輛車的噴漆須要等待,那麼整個工人就去負責的另外一臺車上作發動機裝配的工做。

並行工做者模型雖然容易理解,只需添加更多的工做者就能夠提升性能。但也有缺點: 1.多個工做者須要共享數據,若是A工做者和B工做者共享了內存,那麼每一個工做者爲了保持所操做的是最新數據版本,在每次調度以前都須要進行從新載入,刷新。 2.沒法保證執行順序,例如做業A在做業B以前被分配了,可是執行順序是B->A。 3.若是在存儲中使用了阻塞的數據結構,那麼同一時間只能容許一個線程來對數據結構進行操做,下降了並行性。 Java中的Executor屬於並行工做者模型,在使用時,咱們指定某個Task給某個線程來運行。若是對於線程A來講,他同時須要負責計算工做與IO工做,則線程A能夠本身進行工做的切換,在遇到IO工做時先處理計算工做。數據結構

流水線模型(pipline):

仍是用汽車工廠的例子來講。如今汽車廠改進了生產流程,使用流水線模式進行生產。有的工人負責噴漆,有的工人負責裝配發動機,整臺汽車的生產分紅多個工序。噴漆工人在對上一輛汽車完成噴漆後,不須要等油漆幹,把當前車輛交給下個工序,轉而進行下一輛車的噴漆工做。這輛車在流水線的轉移過程當中油漆已經幹了,到下一個工序就能夠直接工做。

那麼,流水線工做者有何優勢?

1.無需共享狀態,工做者分工明確,無需考慮因併發而帶來的共享數據的問題。例如:不一樣工序的工人所使用的工具確定不一樣,不是共享的。
複製代碼

併發模型的選擇:

若是做業自己就是並行的、獨立的而且沒有狀態共享。就可使用並行工做者模式。例如:在消息中間件場景中,咱們經常使用kafka做爲消息隊列,producer生產併發送消息,consumer獲取消息進行消費,consumer消費任一條消息的過程都是獨立的。併發

若是做業自己不是並行的、非獨立的,就可使用流水線工做模式。例如:咱們須要將一大批文件由小寫改爲大寫,就能夠分出3個步驟:1.讀文件。2.改大小寫。3.寫文件。工具

相關文章
相關標籤/搜索