並行工作者模式:
在並行工作者模式中,委派者接收到任務(如請求監聽執行緒),分發給工作者完成任務(如請求處理執行緒)。舉個例子,如果在汽車工廠執行該模式,包工頭(請求監聽執行緒)負責分發工作給工人(請求處理執行緒),每個工人拿到圖紙之後,該工人從頭到尾負責整臺汽車的生產,但是同個工人可能負責多臺汽車的生產。當汽車工人手上有多臺車需要進行處理時,某輛車的噴漆需要等待,那麼整個工人就去負責的另一臺車上做發動機裝配的工作。並行工作者模型雖然容易理解,只需新增更多的工作者就可以提高效能。但也有缺點: 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.寫檔案。