並行工作者模式:

並行工作者模型雖然容易理解,只需新增更多的工作者就可以提高效能。但也有缺點: 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.寫檔案。
