並行工做者模型雖然容易理解,只需添加更多的工做者就能夠提升性能。但也有缺點: 1.多個工做者須要共享數據,若是A工做者和B工做者共享了內存,那麼每一個工做者爲了保持所操做的是最新數據版本,在每次調度以前都須要進行從新載入,刷新。 2.沒法保證執行順序,例如做業A在做業B以前被分配了,可是執行順序是B->A。 3.若是在存儲中使用了阻塞的數據結構,那麼同一時間只能容許一個線程來對數據結構進行操做,下降了並行性。 Java中的Executor屬於並行工做者模型,在使用時,咱們指定某個Task給某個線程來運行。若是對於線程A來講,他同時須要負責計算工做與IO工做,則線程A能夠本身進行工做的切換,在遇到IO工做時先處理計算工做。數據結構
那麼,流水線工做者有何優勢?
1.無需共享狀態,工做者分工明確,無需考慮因併發而帶來的共享數據的問題。例如:不一樣工序的工人所使用的工具確定不一樣,不是共享的。
複製代碼
若是做業自己就是並行的、獨立的而且沒有狀態共享。就可使用並行工做者模式。例如:在消息中間件場景中,咱們經常使用kafka做爲消息隊列,producer生產併發送消息,consumer獲取消息進行消費,consumer消費任一條消息的過程都是獨立的。併發
若是做業自己不是並行的、非獨立的,就可使用流水線工做模式。例如:咱們須要將一大批文件由小寫改爲大寫,就能夠分出3個步驟:1.讀文件。2.改大小寫。3.寫文件。工具