Reactor Schedulers

Reactor 是一個基于響應式編程的庫,它提供了豐富的調度器(Schedulers)機制,用于管理異步操作的執行環境。Schedulers 是 Reactor 中的核心組件之一,它們允許開發者靈活地控制操作符和訂閱操作在哪個線程上執行,從而實現高效的并發編程。


1. Schedulers 的作用

Schedulers 是 Reactor 提供的調度器接口,用于定義任務的執行上下文。它們封裝了線程管理和調度邏輯,使得開發者可以專注于業務邏輯,而不是線程管理。Schedulers 的主要作用包括:

  • 控制任務的執行線程:通過指定不同的調度器,可以將任務分配到不同的線程或線程池中執行。
  • 支持異步編程:Schedulers 使得開發者可以輕松地在不同的線程中執行異步操作,從而實現并發。
  • 提供多種調度策略:Schedulers 提供了多種調度策略,如立即執行、單線程執行、彈性線程池、固定線程池等,以適應不同的應用場景。

2. 常見的 Schedulers

Reactor 提供了多種預定義的 Schedulers,每種調度器都有其特定的用途和特點:

Reactor 的 Schedulers 類提供了多種靜態方法,用于創建和管理不同的執行上下文(Execution Context),這些上下文決定了任務在哪個線程或線程池中執行。以下是對你提供的內容的詳細解釋:


2.1. 無執行上下文(Schedulers.immediate()
  • 作用Schedulers.immediate() 是一個“無操作”調度器(no-op),它會在當前線程中直接執行提交的 Runnable

  • 特點

    • 任務不會被調度到其他線程,而是直接在當前線程中運行。
    • 適用于簡單的同步操作或測試場景。
  • 示例

    Mono.just("Hello").subscribeOn(Schedulers.immediate()).subscribe(System.out::println);
    
    • 輸出:Hello,且運行在當前線程中。
  • 引用


2. 2. 單線程執行器(Schedulers.single()
  • 作用Schedulers.single() 提供一個可重用的線程,所有調用者共享同一個線程,直到調度器被銷毀。

  • 特點

    • 適合低延遲的一次性任務,如初始化操作。
    • 如果你需要為每個調用創建一個專用線程,應使用 Schedulers.newSingle()
  • 示例

    Mono.just("Hello").subscribeOn(Schedulers.single()).subscribe(System.out::println);
    
    • 輸出:Hello,且運行在 Schedulers.single() 的線程中。
  • 引用


2. 3. 無界彈性線程池(Schedulers.elastic()
  • 作用Schedulers.elastic() 是一個動態線程池,根據需要創建新線程,復用空閑線程。

  • 特點

    • 適合處理長時間運行的任務,如 I/O 操作。
    • 但不再推薦使用,因為它可能導致線程過多,隱藏背壓問題。
  • 示例

    Mono.just("Hello").subscribeOn(Schedulers.elastic()).subscribe(System.out::println);
    
    • 輸出:Hello,且運行在 Schedulers.elastic() 的線程中。
  • 引用


2. 4. 有界彈性線程池(Schedulers.boundedElastic()
  • 作用Schedulers.boundedElastic() 是一個改進版的彈性線程池,它限制了線程數量,避免過多線程消耗資源。
  • 特點
    • 從 3.6.0 版本開始,支持兩種實現:
  1. 基于 ExecutorService 的實現:線程數受限制(默認為 CPU 核心數 × 10),空閑線程在 60 秒后被銷毀。
  2. 基于虛擬線程的實現:在 Java 21+ 環境中運行,每個任務使用一個新的 VirtualThread
  • 適用場景:適合 I/O 阻塞操作,避免占用過多系統資源。

  • 示例

    Mono.just("Hello").subscribeOn(Schedulers.boundedElastic()).subscribe(System.out::println);
    
    • 輸出:Hello,且運行在 Schedulers.boundedElastic() 的線程中。
  • 引用


2. 5. 固定線程池(Schedulers.parallel()
  • 作用Schedulers.parallel() 創建一個固定大小的線程池,線程數通常等于 CPU 核心數。

  • 特點

    • 適合 CPU 密集型任務,如計算密集型操作。
    • Schedulers.boundedElastic() 一起使用,可以實現更精細的資源控制。
  • 示例

    Mono.just("Hello").subscribeOn(Schedulers.parallel()).subscribe(System.out::println);
    
    • 輸出:Hello,且運行在 Schedulers.parallel() 的線程中。
  • 引用


2. 6. 自定義線程池(Schedulers.fromExecutorService(ExecutorService)
  • 作用:允許從現有的 ExecutorService 創建調度器。

  • 特點

    • 適用于需要自定義線程池的場景。
    • 可以靈活控制線程行為,如設置線程數、隊列大小等。
  • 示例

    ExecutorService executor = Executors.newFixedThreadPool(4);
    Schedulers scheduler = Schedulers.fromExecutorService(executor);
    
  • 引用


2. 7. 調度器切換方法:publishOnsubscribeOn
  • subscribeOn

    • 用于指定整個流的訂閱操作在哪個線程上執行。
    • 影響整個操作鏈的訂閱行為。
  • publishOn

    • 用于指定后續操作符在哪個線程上執行。
    • 僅影響操作符鏈中的后續操作。
  • 示例

    Flux.just("A", "B", "C").subscribeOn(Schedulers.elastic()).map(String::toUpperCase).publishOn(Schedulers.parallel()).subscribe(System.out::println);
    
    • subscribeOn 指定了整個流的訂閱線程,publishOn 指定了后續操作的執行線程。
  • 引用


2. 8. 總結
  • Schedulers 提供了多種調度器,用于控制任務的執行上下文。
  • Schedulers.immediate():直接在當前線程執行,適合簡單任務。
  • Schedulers.single():共享一個線程,適合低延遲任務。
  • Schedulers.elastic()Schedulers.boundedElastic():動態線程池,適合 I/O 阻塞任務。
  • Schedulers.parallel():固定線程池,適合 CPU 密集型任務。
  • Schedulers.fromExecutorService():允許自定義線程池。
  • subscribeOnpublishOn:用于切換執行上下文,前者影響整個流,后者影響后續操作。

通過合理選擇和使用這些調度器,可以實現高效的并發編程,優化任務的執行效率,并適應不同的應用場景。


3. Schedulers 的優勢

  • 靈活性:Schedulers 提供了多種調度策略,允許開發者根據具體需求選擇最合適的調度器。
  • 性能優化:通過合理選擇調度器,可以優化任務的執行效率,減少資源消耗。
  • 并發控制:Schedulers 使得開發者可以靈活地控制任務的并發行為,從而實現更高效的異步編程。

4. Schedulers 的應用場景

  • IO 密集型任務:使用 Schedulers.elastic()Schedulers.boundedElastic() 來處理大量并發請求。
  • CPU 密集型任務:使用 Schedulers.parallel() 來處理計算密集型任務。
  • 測試和調試:使用 Schedulers.immediate() 來在當前線程中執行任務,便于調試。
  • 資源管理:通過 Schedulers.fromExecutorService() 自定義線程池,實現對資源的精細控制。

5. 總結

Reactor 的 Schedulers 是一個強大的工具,它允許開發者靈活地控制任務的執行環境。通過合理選擇和使用 Schedulers,可以實現高效的異步編程,優化任務的執行效率,并適應不同的應用場景。Schedulers 的核心優勢在于其靈活性和可配置性,使得開發者可以在不同的線程環境中執行任務,從而實現更高效的并發編程。

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

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

相關文章

設備樹引入

一、設備樹的基本知識 1、什么是設備樹?為什么會有設備樹? 2011年,Linux之父Linus Torvalds發現這個問題后,就通過郵件向ARM-Linux開發社區發了一封郵件,不禁的發出了一句“This whole ARM thing is a f*cking pain i…

【數據標注師】3D標注

目錄 一、 **3D標注知識體系框架**二、 **五階能力培養體系**? **階段1:空間認知筑基(2-3周)**? **階段2:核心標注技能深化**? **階段3:復雜場景解決方案**? **階段4:領域深度專精? **階段5&#xff1…

華為HN8145V光貓改華為藍色公版界面,三網通用,xgpon公版光貓

咸魚只賣20多元一個,還是xgpon的萬兆貓,性價比不錯哦 除了沒有2.5G網口,其他還行。 改成公版光貓后,運營商是無法納管光貓,無法后臺修改光貓數據及超密。 華為 HN8145V 光貓具有以下特點: 性能方面 高速接…

【LeetCode 熱題 100】438. 找到字符串中所有字母異位詞——(解法二)定長滑動窗口+數組

Problem: 438. 找到字符串中所有字母異位詞 題目:給定兩個字符串 s 和 p,找到 s 中所有 p 的 異位詞 的子串,返回這些子串的起始索引。不考慮答案輸出的順序。 【LeetCode 熱題 100】438. 找到字符串中所有字母異位詞——(解法一&…

PAC 學習框架:機器學習的可靠性工程

PAC(Probably Approximately Correct) 是機器學習理論的核心框架,用于量化學習算法的可靠性。它回答了一個關鍵問題: “需要多少訓練樣本,才能以較高概率學到一個近似正確的模型?” 一、PAC 名稱拆解 術語…

嵌入式C語言數組:數組/字符數組

1. 數組 1.1 一維數組 數組是一串連續的地址; 數組名是地址常量,代表數組的起始地址; sizeof(數組名) 可得出數組的總內存空間; C 語言對數組不做越界檢查,使用時應注意; 數組不…

變長字節的數字表示法vb224

開始 數字有大有小,用多少字節表示呢? 本文描述的方案,采用變化的長度。vb是varying bytes的意思,224是表示它特征的一個數。 第一版: 每個字節8比特,最高的1比特用來表示“是否連續”,0表示…

ByteMD+CozeAPI+Coze平臺Agent+Next搭建AI輔助博客撰寫平臺(邏輯清楚,推薦!)

背景: 現在主流的博客平臺AI接入不夠完善,如CSDN接入的AI助手不支持多模態數據的交互、稀土掘金的編輯器AI功能似乎還沒能很好接入(哈哈哈,似乎在考慮布局什么?) 痛點分析: 用戶常常以截圖的形式…

【數據標注師】關鍵詞標注

目錄 一、 **理解關鍵詞標注的核心邏輯**1. **三大標注原則**2. **關鍵詞類型體系** 二、 **四階訓練體系**? **階段1:基礎規則內化**? **階段2:語義濃縮訓練**? **階段3:場景化標注策略**? **階段4:工具效率提升** 三、 **五…

for each循環語句

for each循環語句 for each.....nextFor Each 的案例 for each…next 1、循環對象合集 worksheets workbooks range range("區域")selection (選中的區域)usedrange或者currentregion 返回的單元格區域格式: for each 變量名 in 對象集合(范圍)循環內容…

基于LQR控制器的六自由度四旋翼無人機模型simulink建模與仿真

目錄 1.課題概述 2.系統仿真結果 3.核心程序 4.系統原理簡介 5.參考文獻 6.完整工程文件 1.課題概述 四旋翼無人機因其結構簡單、機動性強和成本低廉等特點,在航拍測繪、物流運輸、災害救援等領域得到廣泛應用。六自由度(3維平移3維旋轉&#xff0…

vftp centos 離線部署

install_ftp_offline.sh vsftpd-3.0.2-28.el7.x86_64.rpm #!/bin/bash# 一鍵安裝配置vsftpd腳本(開放根目錄,禁用chroot)# 安裝vsftpd RPM包 echo "正在安裝vsftpd..." rpm -ivh vsftpd-3.0.2-28.el7.x86_64.rpm if [ $? -ne 0 …

【數據標注】事件標注1

目錄 **一、 深入理解事件標注的核心概念****二、 系統學習:從理論到實踐****1. 吃透標注指南****2. 語言學基礎補充****3. 事件結構解析訓練** **三、 分階段實踐:從簡單到復雜****階段1:基礎標注訓練****階段2:進階挑戰****階段…

在 Ansys Electronics Desktop 中啟用額外的 CPU 內核和 GPU

Ansys Electronics Desktop (AEDT) 可以通過利用多個 CPU 內核和 GPU 加速來顯著縮短仿真時間。但是,啟用其他計算資源除了基本求解器許可證外,還需要適當的高性能計算 (HPC) 許可證。 默認情況下,基本許可證最多允許使用 4 個內核,而無需任何其他 HPC 許可。借助 Ans…

R語言機器學習算法實戰系列(二十六)基于tidymodels的XGBoost二分類器全流程實戰

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹加載R包數據準備數據探索轉換因子查看屬性相關性配對圖PCA 可視化缺失值、異常值處理 & 特征標準數據分割構建模型與調參模型評估模型可解釋性(變量重要性、SHAP、DALEX)變量…

零基礎langchain實戰一:模型、提示詞和解析器

一,使用python調取大模型api 1,獲取api_key 獲取api_key 在各個大模型的官網中獲取。 2,設置api_key 方式一: 在系統環境中可直接執行python代碼:這里以deepseek為例 import os os.environ["DEEPSEEK_API_…

Pytorch分布式通訊為什么要求Tensor連續(Contiguous)

參考資料: https://github.com/pytorch/pytorch/issues/73515 https://www.cnblogs.com/X1OO/articles/18171700 由于業務原因,需要在Pytorch代碼中使用分布式通訊來把計算負載平均到多張顯卡上。在無數次確認我的業務代碼沒問題之后,我開始把…

關于前端頁面上傳圖片檢測

依賴于前文,linux系統上部署yolo識別圖片,遠程宿主機訪問docker全流程(https://blog.csdn.net/yanzhuang521967/article/details/148777650?spm1001.2014.3001.5501) fastapi把端口暴露出來 后端代碼 from fastapi import FastAPI, UploadFile, File, HTTPExcep…

第十三章---軟件工程過程管理

僅供參考 文章目錄 一、Gantt圖是做什么的。二、軟件配置的概念 一、Gantt圖是做什么的。 Gantt 圖(甘特圖)是軟件項目管理中用于進度安排和可視化管理的重要工具,主要用于展示任務的時間安排、進度狀態及任務之間的依賴關系 Gantt 圖是一種…

多模態大語言模型arxiv論文略讀(140)

SemiHVision: Enhancing Medical Multimodal Models with a Semi-Human Annotated Dataset and Fine-Tuned Instruction Generation ?? 論文標題:SemiHVision: Enhancing Medical Multimodal Models with a Semi-Human Annotated Dataset and Fine-Tuned Instruc…