并發編程實戰(生產者消費者模型)

在并發編程中使用生產者和消費者模式能夠解決絕大多數的并發問題。該模式通過平衡生產線程和消費線程的工作能力來提高程序整體處理數據的速度。

生產者和消費者模式:

在線程的世界中生產者就是產生數據的線程,而消費者則是消費數據的線程。在多線程開發中,如果生產者處理速度很快,而消費者處理速度很慢,那么生產者就必須等待消費者處理完才能繼續生產數據。同理,如果消費者處理速度很快,而生產者生產速度很慢,那么消費者就得等待生產者。為了解決這種生產消費能力不均衡的問題,便有了生產者和消費者模式。

在沒有使用生產者和消費者模式之前,往往生產者和消費者都是高耦合的。生產者每次生產一個數據后的邏輯處理都依賴于消費者的處理能力。而采用這種模式之后通過一個容器來解決了強耦合的問題,生產者與消費者之間不再進行通信,所以生產者生產后的數據無需依賴于消費者進行處理而是直接扔到阻塞隊列中,消費者同理。阻塞隊列相當于一個緩沖區,平衡了生產者和消費者的處理能力。

縱觀大多數的設計模式都會采用第三者來給雙方進行解耦,工廠模式的第三方是工廠類,模板模式的第三方是模板類。。。因此在一些實際業務場景中我們也可以通過添加第三者的方式來將整個業務進行解耦的處理操作。

實際應用場景:

郵件分類:

在一個場景中假設我們需要從一個郵箱中將該郵箱的所有郵件進行分類處理。對于最簡單的方法就是采用單線程不斷輪詢獲取到該郵箱的所有郵件并且進行循環處理郵件將其進行。這種方式則最簡單的方式但是這樣做的缺點顯而易見,如果郵箱中突然出現大量的郵件進行處理則會造成處理時間過長而造成性能下降。

那么我們想要提升處理吞吐量最簡單的則是采用多線程的模式來進行處理。那么采用什么樣方式處理最簡單呢。提到多線程處理我們肯定是要保證同步的,那么有沒有現成的線程安全的方案可以直接使用的呢,答案是阻塞隊列。采用生產者消費者的模式來使用阻塞隊列不僅能保證線程安全而且也提高了吞吐量更為重要的則是實現方式非常簡單。

接下來我們將說一說設計思路,就如上圖所示這是整個設計的架構圖。生產者則是無論種類不斷向阻塞隊列里投放郵件,而第一個消費者則是取出郵件后進行分類處理投放到不同的阻塞隊列中去,這個操作是cpu密集型操作而不是io密集型操作因此速度較快,而下面的幾個消費者則是專門進行處理這種類型的郵件的。采用上述的方式不僅提高了吞吐量更為重要的是解耦并且實現簡單。這就是生產者消費者模式。在實際的許多業務場景中使用這種方式進行處理則是很常見的。

線程池:

實際上我們最常使用的線程池它的內部本身就是采用的生產者消費者的模型機制。而這個模型設計的更加巧妙。

我們都知道線程池主要是由工作線程和任務隊列以及任務組成的。在最常見的生產者消費者模型中則是生產者將任務丟給隊列中,消費者從隊列中取出。但是對于線程池則是如果有空閑線程則可以將任務直接交給空閑線程去處理這樣做就省下了放到隊列中的步驟。

異步線程池:

線程池固然好用但是有兩個缺點:

1.線程池中的任務無法持久保存,如果主機宕機則會導致任務全部丟失

2.線程池只能處理本機的任務在集群中則無法去處理

因此對于以上缺點,異步線程池則能解決此類問題。結構如上圖所示。

可以看出,當有任務來到的時候生產者將任務放入到數據庫中,這次不再是阻塞隊列中去。原因很簡單:1.任務持久化處理,2.適用與分布式架構的模式。同時每個機器中開辟多個線程池,這多個線程池從數據庫中取出任務,同時我們賦予任務狀態來保證同步,狀態值:創建,執行中,重試,掛起,中止,完成。

創建:這個狀態則是生產者剛把任務放入數據庫中等待消費者處理

執行中:消費者拿到任務后修改狀態值表示這個任務以及被消費者處理中,其他消費者則在此過程中無法處理該任務

重試:消費者處理過程中發生異常情況則將此狀態為設置為重試,根據不同任務的類型對應不同重試的策略

掛起:當前任務等待某個前置任務的完成之后才能執行本任務那么就需要將其設置為掛起,業務員自己設置掛起后的策略

中止:由于某種原因本任務則無需執行則會將其設置為中止狀態

完成:完成了本任務的執行

那么異步線程池需要注意哪些地方呢

任務隔離:異步任務往往是有多種類型的,但是系統的資源是有限的。如果采用優先級的方式那么很有可能會造成某些高優先級的任務永遠無法執行,因此我們采用的策略則是根據不同的任務我們采用不同的線程池進行處理,也就是任務類型分組處理,我們可以通過控制分組線程池的多少來進行進行控制處理的速率以及資源的部署。這樣就不會造成某些任務永遠無法處理的情況頂多是那些分配的資源少的任務類型處理速度上較慢。

重試策略:根據不同的任務類型設置不同的重試策略,有些任務可能要求實時性高。那么每次的重試間隔就會非常短,如果對實時性要求不高,可以采用默認的重試策略來對其進行重試。每個類型可以設置不同的重試次數

勿本機存儲:對于不同機器上的線程池不要采用本機存儲的方式因為整個項目采用的是集群部署,如果采用本機存儲,某些后續任務可能有著上一個任務存儲資源的存儲路徑,如果前置任務在機器A中完成那么后置任務將會無法找到這個資源

異步屬性:對于所有任務都必須要帶有任務的狀態,名稱,下次執行時間,執行次數,任務類型,報錯類型等等任務屬性。這樣對于后續任務的進展將會有很大的幫助簡化了不少的業務復雜度

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83925.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83925.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83925.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣hot100---152.乘積最大子數組

給你一個整數數組 nums ,請你找出數組中乘積最大的非空連續子數組(該子數組中至少包含一個數字),并返回該子數組所對應的乘積。 測試用例的答案是一個 32-位 整數。 示例 1: 輸入: nums [2,3,-2,4] 輸出:6解釋: 子數組 [2,3] 有最…

什么是DevOps智能平臺的核心功能?

在數字化轉型的浪潮中,DevOps智能平臺已成為企業提升研發效能、加速產品迭代的核心工具。然而,許多人對“DevOps智能平臺”的理解仍停留在“自動化工具鏈”的表層概念。今天,我們從一個真實場景切入:假設你是某互聯網公司的技術負…

柯尼卡美能達Konica Minolta bizhub 205i打印機信息

基本參數 產品類型:激光數碼復合機顏色類型:黑白涵蓋功能:復印、打印、掃描最大原稿尺寸:A3內存容量:256MB供紙容量:標配 350 頁,最大 1350 頁介質重量:標準紙盒 64-157g/㎡&#xf…

虛擬機與宿主機應用通信配置指南

1. 選擇虛擬機網絡模式 橋接模式 (Bridged) 客戶機獲得獨立局域網IP,與宿主機同網段。 客戶機可直接訪問宿主機IP(如 192.168.1.x)。 Host-Only 模式 僅宿主機與客戶機之間通信,宿主機通常有一個虛擬網卡(如 192.16…

網絡庫libhv介紹

libhv是一個類似于libevent、libev、libuv的跨平臺網絡庫,提供了更易用的接口和更豐富的協議,用來開發TCP/UDP/SSL/HTTP/WebSocket/MQTT 客戶端/服務端。源碼地址:https://github.com/ithewei/libhv,最新發布版本為v1.3.3&#xf…

施耐德特價型號伺服電機VIA0703D31A1022、常見故障

?? ?一、啟動類故障? ?電機無法啟動? ?可能原因?:電源未接通、制動器未釋放、接線錯誤或控制器故障。?解決措施?: 檢查電源線路及斷路器狀態;驗證制動器是否打開(帶制動器型號);核對電機與控制器…

【Redis從入門到精通實戰文章匯總】

📚博客主頁:代碼探秘者 ?專欄:文章正在持續更新ing… ?C語言/C:C(詳細版) 數據結構) 十大排序算法 ?Java基礎:JavaSE基礎 面向對象大合集 JavaSE進階 Java版數據結構JDK新特性…

MCP 技術完全指南:微軟開源項目助力 AI 開發標準化學習

引言 在人工智能快速發展的今天,如何讓 AI 模型與客戶端應用程序之間建立標準化的交互機制,已成為開發者們亟待解決的關鍵問題。微軟近期開源的 mcp-for-beginners 項目,為我們提供了一個系統性學習 Model Context Protocol (MCP) 的絕佳機會…

SQL進階之旅 Day 20:鎖與并發控制技巧

【JDK21深度解密 Day 20】鎖與并發控制技巧 文章簡述 在高并發的數據庫環境中,鎖與并發控制是保障數據一致性和系統穩定性的核心機制。本文作為“SQL進階之旅”系列的第20天,深入探討SQL中的鎖機制、事務隔離級別以及并發控制策略。文章從理論基礎入手…

Qt(part 2)1、Qwindow(菜單欄,工具欄,狀態欄),鉚接部件,核心部件 ,2、添加資源文件 3、對話框

1、Qwindow tips:1,首先為什么創建出的對象基本都是指針形式,個人覺得是對象樹的原因(自動釋放內存),指針來訪問成員函數->的形式。2,菜單欄只能一個的,放窗口基本Set&#xff0c…

一款“短小精悍的”手機錄屏軟件

這個時代,手機自帶錄屏功能已經不是什么稀奇的事情了,但是手機自帶的錄屏功能不都是完美的,無法靜音錄屏、、不能修改畫質、不能剪輯、不能自定義水印......emmm.....貌似除了錄屏就什么都不會 今天分享的這款軟件——ADV屏幕錄制漢化版&…

力扣HOT100之二分查找:153. 尋找旋轉排序數組中的最小值

這道題是上一道題:33. 搜索旋轉排序數組的前置題,有點沒看懂力扣為什么要這樣安排題目順序,應該把這道題按排在前面才對啊。。。這道題的思路已經在上一道題的思路中說過了,這里就直接復制粘貼上一篇博客中的內容了。 我們閱讀完題…

libiec61850 mms協議異步模式

之前項目中使用到libiec61850庫,都是服務端開發。這次新的需求要接收服務端的遙測數據,這就涉及到客戶端開發了。 客戶端開發沒搞過啊,挑戰不少,但是人不就是通過戰勝困難才成長的嘛。通過查看libiec61850的客戶端API發現&#xf…

【 知你所想 】基于ernie-x1-turbo推理模型實現趣味猜心游戲

🌟 項目特點 🤖 智能AI:基于文心一言大模型,具有強大的推理能力🎯 實時思考:展示AI的思考過程,讓你了解AI是如何推理的🎮 互動性強:通過簡單的"是/否"問答&…

Excel 模擬分析之單變量求解簡單應用

正向求解 利用公式根據貸款總額、還款期限、貸款利率,求每月還款金額 反向求解 根據每月還款能力,求最大能承受貸款金額 參數: 目標單元格:求的值所在的單元格 目標值:想要達到的預期值 可變單元格:變…

關于easyexcel動態下拉選問題處理

前些日子突然碰到一個問題,說是客戶的導入文件模版想支持部分導入內容的下拉選,于是我就找了easyexcel官網尋找解決方案,并沒有找到合適的方案,沒辦法只能自己動手并分享出來,針對Java生成Excel下拉菜單時因選項過多導…

【Qt】之【Get√】【Bug】通過值捕獲(或 const 引用捕獲)傳進 lambda,會默認復制成 const

通過值捕獲&#xff08;或 const 引用捕獲&#xff09;傳進 lambda&#xff0c;會默認復制成 const。 背景 匿名函數外部定義 QSet<QString> nameSet,需要傳入匿名函數使用修改 connect(dlg, ..., [nameSet](...) {nameSet.insert(name); // ? 這里其實是 const QSet…

css元素的after制作斜向的刪除線

<div class"price_div"></div>.price_div{position: relative; } ::after{content: ;position: absolute;left: 0;top: 50%;width: 100%;height: 2px;background: #FF186B;transform: rotate(-5deg); }

uniapp map組件的基礎與實踐

UniApp 中的 map 組件用于在應用中展示地圖,并且支持在地圖上添加標記、繪制線條和多邊形等功能。以下是一些基本用法: 1. 基本結構 首先,確保你在頁面的 .vue 文件中引入了 map 組件。以下是創建一個簡單地圖的基本代碼結構: <template><view class="con…

深入理解PHP安全漏洞:文件包含與SSRF攻擊全解析

深入理解PHP安全漏洞&#xff1a;文件包含與SSRF攻擊全解析 前言 在Web安全領域&#xff0c;PHP應用程序的安全問題一直備受關注。本文將深入探討兩種常見的PHP安全漏洞&#xff1a;文件包含漏洞和服務器端請求偽造(SSRF)&#xff0c;幫助開發者理解漏洞原理、利用方式以及防…