線程池的創建規范

第1章:引言——為什么使用線程池?

1.1 線程池的概念

????????線程池是一個容器,用來管理多個工作線程,它通過對線程的管理、復用來提高系統性能。線程池的核心理念是將線程的創建、銷毀、復用等操作交給線程池來管理,避免了頻繁的線程創建與銷毀的性能開銷。

????????在線程池中,當你提交一個任務時,如果有空閑線程,線程池會直接分配給這個任務;如果沒有空閑線程,任務會被放入任務隊列中等待執行。線程池能夠靈活控制線程的數量、工作方式,幫助開發者有效管理并發任務,提升系統的吞吐量和響應能力。

1.2 線程池的優勢

  1. 避免頻繁創建和銷毀線程的開銷

    • 每次創建一個新線程需要耗費一定的時間和內存。如果頻繁地創建和銷毀線程,會極大地降低程序的性能。線程池通過復用線程,避免了這些額外的開銷。
  2. 提高響應速度

    • 如果使用線程池,任務提交后可以直接通過已有的線程來執行,不必等待線程的創建,因此響應時間大大減少。
  3. 控制并發數量

    • 線程池能夠控制并發線程的數量,避免系統資源(如 CPU、內存)被耗盡。通過合理的線程池配置,可以有效避免過多線程導致的性能下降或系統崩潰。
  4. 任務管理

    • 線程池能將任務提交到隊列中,按順序處理這些任務。對于任務的調度、優先級等,線程池可以提供較為靈活的支持。

1.3 為什么線程池是現代應用程序的必備組件

????????在現代應用中,尤其是服務器端和高并發的系統中,線程池幾乎是標配。比如 Web 服務器、數據庫連接池、文件下載、實時任務處理等場景,都會大量使用線程池來處理并發請求。

  • Web 服務器:處理大量用戶請求,每個請求都可以分配一個線程,線程池可以限制并發請求的數量,避免過多的線程對服務器造成壓力。
  • 數據庫連接池:線程池用于管理數據庫連接,保證應用程序不會因為大量的數據庫請求導致連接超時或資源枯竭。

????????通過合理使用線程池,可以使得系統在高并發環境下保持高效運行,避免資源浪費,提高系統的可擴展性和穩定性。

第2章:線程池的快捷方法與規范

2.1 Executors 工具類的快捷方法

????????在 Java 中,Executors 工具類提供了多個方法用于快速創建常見的線程池。盡管這些方法使用方便,但它們也存在一些隱患,因此大廠的規范通常不推薦使用這些快捷方法。常見的快捷方法包括:

  1. newFixedThreadPool(int nThreads)

    • 創建一個固定線程數的線程池,線程池中始終保持 nThreads 個線程。如果有更多的任務提交,它們會被放入隊列中等待。
    • 適用于任務數相對固定且較為均衡的場景。
  2. newCachedThreadPool()

    • 創建一個可緩存的線程池,線程池中的線程數量根據需要動態增加。當線程空閑超過 60 秒時,線程會被回收。
    • 適用于任務數量不固定且執行時間較短的場景,但如果任務量過大,可能會導致過多線程的創建,從而導致資源耗盡。
  3. newSingleThreadExecutor()

    • 創建一個單線程池,所有任務按順序執行,保證任務的順序性。適用于只需要一個線程順序執行任務的場景。
    • 如果線程出現異常,線程池會創建一個新的線程來繼續處理任務。
  4. newWorkStealingPool()

    • 創建一個工作竊取線程池,適用于任務之間的執行時間差異較大,線程池能夠通過“竊取”其他線程任務來提高效率的場景。
    • 常用于分布式任務和高并發情況下的多線程任務調度。

2.2 為什么大廠規范禁止使用快捷方法?

????????盡管 Executors 提供的快捷方法使用方便,但它們并不適合復雜的生產環境。以下是使用這些方法可能帶來的問題:

  1. OMM 異常(Out of Memory Exception)

    • newCachedThreadPool() 沒有最大線程數限制,線程池可能會創建大量的線程。任務數量劇增時,線程池會創建過多的線程,導致系統資源(如內存、CPU)耗盡,最終可能觸發 OutOfMemoryError。這會對系統的穩定性和性能產生嚴重影響。
  2. 難以定制化線程池配置

    • 使用快捷方法創建的線程池,線程池的參數(如核心線程數、最大線程數、空閑線程的存活時間等)是固定的,無法根據具體業務需求靈活調整。對于一些復雜的業務場景,可能需要針對線程池做更多的優化,例如調整拒絕策略、任務隊列類型等。
  3. 線程池配置不可見性

    • Executors 提供的快捷方法內部封裝了線程池的創建和配置,開發者無法直接訪問線程池的詳細配置,導致難以調試和調整線程池的性能。尤其是在生產環境中,調整線程池的大小、任務隊列的類型等參數是常見的優化手段。
  4. 安全性和可靠性問題

    • 快捷方法無法提供定制化的拒絕策略。對于高并發系統,如果線程池的線程數已滿且任務隊列也滿了,線程池會根據默認的拒絕策略(通常是拋出異常或丟棄任務),這可能會導致任務丟失,或者程序崩潰。
  5. 擴展性差

    • Executors 中的線程池無法靈活擴展。例如,線程池中的線程數和任務隊列大小是固定的,無法根據實際運行時的任務負載動態調整。在高并發或者負載波動較大的場景下,線程池可能無法提供最優的資源分配。

2.3 推薦使用 ThreadPoolExecutor 創建線程池

????????為了更好地管理線程池并避免上述問題,Java 提供了 ThreadPoolExecutor 類,它允許開發者根據業務需求靈活配置線程池的各項參數。我們接下來會詳細講解如何使用 ThreadPoolExecutor 來創建和管理線程池,確保線程池配置的合理性和穩定性。

第3章:常見線程池的劣勢分析

????????在這一章,我們將詳細分析 Executors 提供的四種常見線程池:FixedThreadPoolCachedThreadPoolSingleThreadExecutorWorkStealingPool,并討論它們的劣勢。理解這些劣勢將幫助我們在實際開發中選擇合適的線程池類型,避免潛在的問題。

3.1 FixedThreadPool(固定線程池)

??FixedThreadPool 是線程池中最常見的一種,它會創建一個固定數量的線程,處理所有的任務。如果任務隊列滿了,新的任務會被放入等待隊列中,直到有空閑線程時才會執行。

優點

  • 線程數量固定:固定線程池可以確保線程數量不會超過指定的 corePoolSize,避免線程過多對系統資源的耗盡。
  • 任務隊列支持:它可以將任務放入隊列中等待執行,在任務較多的情況下能有效減少線程頻繁創建和銷毀帶來的開銷。

劣勢

  1. 線程數不可動態調整

    • 線程池中的線程數在創建時就已確定,無法根據負載的變化動態調整線程數量。如果任務量突然增加,而現有的線程池無法擴展,可能會導致任務積壓,延遲響應。
    • 這種固定的線程池適合負載較為穩定的場景,但在負載波動較大的環境下,它的表現可能不夠優秀。
  2. 空閑線程資源浪費

    • 即使線程池中的線程處于空閑狀態,仍然會占用系統資源。這會造成一些資源浪費,特別是在任務量較少的情況下,空閑線程長期存在會增加內存和 CPU 的開銷。
  3. 任務積壓可能導致線程饑餓

    • 如果任務數量超過了線程池的最大容量,新的任務將會被放入隊列中等待執行。如果任務隊列過長,線程池可能會出現饑餓現象(線程不能及時獲取任務)。
  4. 對長時間運行任務的適應性差

    • 固定線程池對短期任務非常有效,但如果任務是長時間運行的,可能會阻塞其他任務的執行。比如,長時間的計算任務會占用線程池中的線程,導致其他任務長時間不能獲得執行。

3.2 CachedThreadPool(緩存線程池)

??CachedThreadPool 是一種靈活的線程池,它會根據任務的需要動態創建線程,線程池的大小沒有固定上限。如果線程空閑超過 60 秒,線程會被回收。

優點

  • 動態調整線程數量:線程池可以根據系統的負載自動擴展線程數量,這使得它在任務量較為波動的場景中表現較好。
  • 適應短期任務:適用于執行時間較短的任務,這些任務可以快速完成,線程池會回收空閑線程。

劣勢

  1. 線程數量無法控制

    • 由于 CachedThreadPool 的線程數沒有上限,如果任務數量非常多,線程池會創建大量的線程。最終可能導致系統資源(如內存和 CPU)被耗盡,進而引發 OutOfMemoryError
    • 在高并發或任務過載的情況下,線程池會創建過多線程,這可能導致系統資源被過度消耗。
  2. 可能導致線程泄漏

    • 當系統中有大量短生命周期的任務時,CachedThreadPool 可能會導致線程池不斷創建線程,而過多的線程可能不會及時回收,造成線程泄漏。
  3. 不適合長時間運行的任務

    • 如果線程池中的線程空閑時間過長,它會被回收。而如果系統中有一些長時間運行的任務,CachedThreadPool 可能會不斷創建新的線程來處理這些任務,導致線程池中的線程過多,進一步影響系統性能。
  4. 隊列管理缺失

    • CachedThreadPool 沒有明確的隊列管理機制,因此當任務數量急劇增加時,會立即創建新線程,而沒有任何機制來控制線程的最大數量。這可能會導致過多的并發線程和任務隊列的積壓,造成系統不穩定。

3.3 SingleThreadExecutor(單線程池)

??SingleThreadExecutor 是一種特殊的線程池,它只包含一個工作線程。所有提交的任務會按照提交順序執行,并且只有一個線程在執行任務。

優點

  • 保證任務順序:所有任務都在同一個線程中順序執行,適用于任務必須按順序執行的場景。
  • 簡單的資源管理:由于只有一個線程,資源管理較為簡單,系統開銷較小。

劣勢

  1. 性能瓶頸

    • 由于只有一個線程可以執行任務,任務的執行是串行的,這可能會造成較大的性能瓶頸。特別是當任務較多時,所有任務都會排隊等待執行,無法并行處理。
  2. 單點故障

    • 如果單一的工作線程崩潰或出現故障,整個線程池將無法繼續處理任務,導致任務積壓,系統可能會停滯。
  3. 不能高效利用多核 CPU

    • 在多核 CPU 上,SingleThreadExecutor 不能充分利用多個核心。多核系統需要更多的線程池來同時執行多個任務,SingleThreadExecutor 的設計限制了這一點。
  4. 任務隊列可能阻塞

    • 如果任務積壓過多,隊列會變得非常長,所有任務只能排隊等待單一線程處理,導致任務執行延遲。

3.4 WorkStealingPool(工作竊取線程池)

? ?WorkStealingPool 是 Java 8 引入的一種線程池,它基于工作竊取算法。當線程池中的某個線程完成任務后,它會去“竊取”其他線程的任務來繼續執行,從而避免空閑線程浪費。

優點

  • 動態線程分配:工作竊取算法能夠根據任務執行的時間差異,動態調整線程的分配,最大程度地提高線程的利用率。
  • 適合負載不均衡的場景:在某些任務執行時間差異較大的場景下,WorkStealingPool 可以通過“竊取”任務來提高整體性能。

劣勢

  1. 不適合任務執行時間差異不大的場景

    • 如果任務的執行時間差異較小,工作竊取算法的效果并不明顯。此時,WorkStealingPool 可能會引入額外的開銷,因為它會在多個線程間分配任務,導致資源浪費。
  2. 線程池配置不可調節

    • WorkStealingPool 在創建時無法直接控制核心線程數、最大線程數、隊列大小等參數,因此在一些特定場景下,它的表現可能無法滿足需求。
  3. 復雜的工作調度

    • 工作竊取機制會增加線程池調度的復雜度,這對一些簡單的任務調度場景可能不是最優選擇。復雜的調度可能導致更多的上下文切換,影響性能。
  4. 資源分配不均

    • 在負載不均衡的情況下,某些線程可能會長時間處于空閑狀態,而其他線程則可能被過度使用,導致資源分配不均衡,影響系統的整體吞吐量。

總結:

????????從上述分析可以看出,FixedThreadPoolCachedThreadPoolSingleThreadExecutorWorkStealingPool 各有優缺點。選擇合適的線程池類型時,需要根據實際任務的特點和系統的負載情況來決定:

  • 如果任務負載穩定,線程數固定,FixedThreadPool 是一個不錯的選擇。
  • 如果任務量波動較大,CachedThreadPool 適合靈活擴展,但需要小心內存消耗。
  • 如果任務必須按順序執行,可以選擇 SingleThreadExecutor,但注意它的性能瓶頸。
  • 如果任務執行時間差異較大,且線程池需要高效利用資源,WorkStealingPool 是一個值得考慮的選擇。

第4章:使用 ThreadPoolExecutor 創建線程池

????????在這一章中,我們將深入探討 ThreadPoolExecutor,它是 Java 中提供的最靈活和功能最強大的線程池類。通過 ThreadPoolExecutor,你可以完全控制線程池的行為,包括線程數量、任務隊列、線程存活時間等多個參數,使得它能夠適應各種不同的業務需求。

4.1 ThreadPoolExecutor 概述

??ThreadPoolExecutor 類是 Java 提供的用于管理線程池的核心類,提供了更細粒度的線程池管理能力。通過 ThreadPoolExecutor,我們可以完全控制線程池的行為,避免了 Executors 提供的快捷方法的局限性。

ThreadPoolExecutor 的構造方法如下:

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory, RejectedExecutionHandler handler);

????????這個構造方法有 七個參數,我們將在本章中逐一解析每個參數的含義以及它們如何影響線程池的工作方式。

4.2 ThreadPoolExecutor 的七個參數

1. corePoolSize(核心線程數)

  • 定義:核心線程數是線程池中始終保持的最小線程數,即使這些線程處于空閑狀態,它們也不會被銷毀。核心線程數的線程池在啟動時會創建這些線程,除非 allowCoreThreadTimeOut(true) 被設置為 true,否則這些線程會一直保持在線程池中。

  • 作用

    • 控制線程池中至少保持的線程數量,適用于任務數量較為穩定的場景。
    • 如果任務數量較多,且線程池沒有足夠的線程,新的線程會被創建來處理任務。
  • 使用場景

    • 適用于那些任務數較為平穩且能夠并發執行的應用場景。比如 Web 服務、數據庫操作等。
  • 舉例

    int corePoolSize = 10;  // 始終保持10個線程
    

2. maximumPoolSize(最大線程數)

  • 定義:最大線程數是線程池能夠容納的最大線程數量。如果任務量很大,且任務隊列已滿,線程池將創建新線程直到達到最大線程數。

  • 作用

    • 控制線程池中線程的最大數量。合理設置最大線程數可以防止線程池中的線程過多,導致系統資源(如內存、CPU)耗盡。
  • 使用場景

    • 當任務量突然增大時,線程池會擴展線程數量來適應突發的負載。適用于突發性任務或突發性高并發的場景。
  • 舉例

    int maximumPoolSize = 50;  // 最大線程數為50
    

3. keepAliveTime(線程空閑存活時間)

  • 定義:線程空閑存活時間是指當線程池中的線程數超過核心線程數時,這些線程在空閑時會等待的最長時間。超過這個時間后,線程會被終止和回收。

  • 作用

    • 控制線程池中空閑線程的存活時間。可以通過合理設置空閑時間來釋放不再需要的線程,避免資源浪費。
  • 使用場景

    • 如果任務量波動較大且任務執行時間不均勻,可以根據任務的空閑時間來回收一些不再需要的線程。
  • 舉例

    long keepAliveTime = 60L;  // 線程在空閑時最多等待60秒
    

4. unit(時間單位)

  • 定義keepAliveTime 參數的單位,可以是 TimeUnit 枚舉類型中的任意一個,比如:TimeUnit.SECONDSTimeUnit.MILLISECONDSTimeUnit.MINUTES 等。

  • 作用

    • 控制線程池中線程空閑時的存活時間單位,配合 keepAliveTime 參數使用。
  • 使用場景

    • 配合 keepAliveTime 一起使用,控制線程空閑時的存活時間,可以通過選擇適當的時間單位來優化線程池資源回收。
  • 舉例

    TimeUnit unit = TimeUnit.SECONDS;  // 空閑時間單位為秒
    

5. workQueue(任務隊列)

  • 定義workQueue 是線程池中的任務隊列,任務提交后會先進入隊列,然后由空閑的線程來執行。

  • 作用

    • 控制線程池如何存儲和管理任務隊列。任務隊列有多種實現方式,每種實現方式有不同的性能特征。
  • 使用場景

    • 如果任務量較大且任務執行時間較長,可以選擇一個容量較大的隊列類型。若任務較少,使用一個較小的隊列也能更好地利用線程池。
  • 常見的任務隊列類型

    • SynchronousQueue:一種直接傳遞隊列,沒有緩沖區,適用于高并發的任務。
    • LinkedBlockingQueue:一個基于鏈表的阻塞隊列,隊列沒有大小限制,適用于任務量較大的場景。
    • ArrayBlockingQueue:一個基于數組的阻塞隊列,隊列大小固定,適用于任務數量較為穩定的場景。
  • 舉例

    BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100);  // 任務隊列大小為100
    

6. threadFactory(線程工廠)

  • 定義threadFactory 用于創建新線程的工廠。通過提供一個自定義的 ThreadFactory,你可以控制線程的創建行為,例如:為每個線程命名、設置線程的優先級等。

  • 作用

    • 控制線程的創建,能夠實現定制化線程管理。比如,可以通過 ThreadFactory 為每個線程指定名稱、優先級等屬性。
  • 使用場景

    • 在一些需要高可維護性的系統中,可以為每個線程指定不同的屬性,例如線程池中的線程可能需要特定的命名規則或者更高的優先級。
  • 舉例

    ThreadFactory threadFactory = Executors.defaultThreadFactory();  // 使用默認的線程工廠
    

7. handler(拒絕策略)

  • 定義handler 是線程池的拒絕策略,指當線程池無法處理任務時,應該采取什么措施。常見的拒絕策略有四種:

    • AbortPolicy:直接拋出 RejectedExecutionException 異常。
    • CallerRunsPolicy:由調用者線程來執行任務,而不是由線程池來執行。
    • DiscardPolicy:丟棄當前任務,不拋出異常。
    • DiscardOldestPolicy:丟棄隊列中最老的任務。
  • 作用

    • 通過合理選擇拒絕策略,可以控制當任務過多而線程池無法處理時的行為。每種策略的優缺點不同,應該根據應用場景來選擇。
  • 使用場景

    • 對于任務量突然增多的場景,需要選擇合適的拒絕策略。比如,在高并發情況下,可以選擇 CallerRunsPolicy 來讓調用者線程執行任務,避免任務丟失。
  • 舉例

    RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();  // 選擇默認的拒絕策略
    

4.3 ThreadPoolExecutor 的靈活性與優勢

????????通過 ThreadPoolExecutor 提供的七個參數,開發者可以精確控制線程池的各項行為,以適應不同的應用需求。例如,線程池的核心線程數、最大線程數、任務隊列的選擇、線程空閑時間的設置等,都能影響線程池的性能和響應速度。

  • 可控性強ThreadPoolExecutor 讓你可以根據實際情況調整線程池的核心線程數、最大線程數、任務隊列等,保證線程池在不同負載下的穩定性。
  • 性能優化:你可以為線程池配置適當的拒絕策略,避免任務過載或者丟失。
  • 靈活適應ThreadPoolExecutor 能夠根據任務負載自動調整線程數量,適應各種不同的場景需求。

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

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

相關文章

【藍橋杯比賽-C++組-經典題目匯總】

1. 最短路 題目描述&#xff1a; 如下圖所示&#xff0c;G是一個無向圖&#xff0c;其中藍色邊的長度是1、橘色邊的長度是2、綠色邊的長度是3。 則從 A 到 S 的最短距離是多少&#xff1f; #include <iostream> #include <cstring> using namespace std; const i…

活動預告 | Microsoft 安全在線技術公開課:通過擴展檢測和響應抵御威脅

課程介紹 通過 Microsoft Learn 免費參加 Microsoft 安全在線技術公開課&#xff0c;掌握創造新機遇所需的技能&#xff0c;加快對 Microsoft Cloud 技術的了解。參加我們舉辦的“通過擴展檢測和響應抵御威脅”技術公開課活動&#xff0c;了解如何更好地在 Microsoft 365 Defen…

第八節:GLM-4v-9b模型的大語言模型源碼解讀(ChatGLMForConditionalGeneration)

文章目錄 前言一、ChatGLMForConditionalGeneration類源碼解讀1、ChatGLMForConditionalGeneration類源碼2、self.transformer方法源碼3、loss_fct = CrossEntropyLoss(ignore_index=-100)方法Demo二、ChatGLMModel類源碼解讀三、GLMTransformer結構源碼解讀四、GLMBlock結構源…

Windows onnxruntime編譯openvino

理論上來說&#xff0c;可以直接訪問 ONNXRuntime Releases 下載 dll 文件&#xff0c;然后從官方文檔中下載缺少的頭文件以直接調用&#xff0c;但我沒有嘗試過。 1. 下載 OpenVINO 包 從官網下載 OpenVINO 的安裝包并放置在 C:\Program Files (x86) 路徑下&#xff0c;例如…

Vue3 中的插槽

Vue3 中插槽的使用&#xff0c;插槽是 Vue 中的一個特別特性&#xff0c;插槽就是模版內容。例如<h1>標題 1</h1>標題 1 就是插槽&#xff0c;Vue 是無法識別模板內容的&#xff0c;只能通過屬性進行傳遞。Slot 主要包括默認、具名和作用域。Slot開發起來難度不大&…

01.02周四F34-Day43打卡

文章目錄 1. 地是濕的。昨晚估計下雨了。2. 你可能把包丟在餐廳里了吧?3. 她說他可能誤了航班。4. 我本來應該早點來的,但路上特別堵。5. 約翰可能在那次事故中受了重傷。6. 這是一個情景對話7. 我本可以走另一條路的。8. 我準是瘦了不少,你看我這褲子現在多肥。9. 錢沒了!會…

深度學習:基于MindSpore NLP的數據并行訓練

什么是數據并行&#xff1f; 數據并行&#xff08;Data Parallelism, DP&#xff09;的核心思想是將大規模的數據集分割成若干個較小的數據子集&#xff0c;并將這些子集分配到不同的 NPU 計算節點上&#xff0c;每個節點運行相同的模型副本&#xff0c;但處理不同的數據子集。…

五類推理(邏輯推理、概率推理、圖推理、基于深度學習的推理)的開源庫 (一)

在開發中&#xff0c;有一些開源庫可以實現不同類型的推理&#xff0c;包括邏輯推理、概率推理、圖推理、基于深度學習的推理等。以下是五類推理&#xff08;邏輯推理、概率推理、圖推理、基于深度學習的推理&#xff09;的現成開源庫&#xff0c;它們各自的功能、特點和適用場…

高等數學學習筆記 ? 函數的極限

1. 函數的極限定義 備注&#xff1a;已知坐標軸上一點&#xff0c;則&#xff1a; ①&#xff1a;的鄰域&#xff1a;指附近的開區間&#xff0c;記作。 ②&#xff1a;的去心鄰域&#xff1a;指附近的開區間&#xff0c;但不包含&#xff0c;記作。 ③&#xff1a;的鄰域&…

Python用K-Means均值聚類、LRFMC模型對航空公司客戶數據價值可視化分析指標應用|數據分享...

全文鏈接&#xff1a;https://tecdat.cn/?p38708 分析師&#xff1a;Yuling Fang 信息時代的來臨使得企業營銷焦點從產品中心轉向客戶中心&#xff0c;客戶關系管理成為企業的核心問題&#xff08;點擊文末“閱讀原文”獲取完整代碼數據&#xff09;。 客戶關系管理的關鍵是客…

【前端系列】優化axios響應攔截器

文章目錄 一、前言&#x1f680;&#x1f680;&#x1f680;二、axios響應攔截器&#xff1a;??????2.1 為什么前端需要響應攔截器element ui的消息組件 一、前言&#x1f680;&#x1f680;&#x1f680; ?? 回報不在行動之后&#xff0c;回報在行動之中。 這個系列可…

【 IEEE 獨立出版 · EI核心、Scopus穩定檢索 】第二屆算法、軟件工程與網絡安全國際學術會議(ASENS 2025)

ASENS 2025 第二屆算法、軟件工程與網絡安全國際學術會議 2025 2nd International Conference on Algorithms, Software Engineering and Network Security 中國 廣州 2025年3月21-23日 會議官網&#xff1a;www.ic-asens.org IEEE 獨立出版 EI核心、Scopus快速…

/ete/security/limits.conf參數詳解

/ete/security/limits.conf配置文件 內容如下&#xff1a; * soft nofile 65535 * hard nofile 65535參數詳解 *: 表示對所有用戶生效soft: 表示軟限制&#xff0c;即用戶可以通過ulimit命令自行調整該值hard: 表示硬限制&#xff0c;即用戶無法通過ulimit命令將該值調整超過…

#Vue3篇: 無感刷新token的原理JSESSIONID無感刷新和JWT接口刷新

基于這個后端是怎么更新token的 為了理解后端是如何更新 Token 的&#xff0c;我們需要考慮一個典型的基于 Token 的身份驗證流程&#xff0c;特別是涉及 JSESSIONID 和自定義 Token&#xff08;如 JWT, JSON Web Token&#xff09;的情況。 下面我將介紹兩種常見的更新 Token …

模塊化通訊管理機在物聯網系統中的應用

安科瑞劉鴻鵬 摘要 隨著能源結構轉型和智能化電網的推進&#xff0c;電力物聯網逐漸成為智能電網的重要組成部分。本文以安科瑞ANet系列智能通信管理機為例&#xff0c;探討其在電力物聯網中的應用&#xff0c;包括數據采集、規約轉換、邊緣計算、遠程控制等技術實踐&#…

Python基于Gradio可視化部署機器學習應用

Gradio 是一個用于快速創建機器學習模型和用戶界面之間交互的 Python 庫。它允許你無需編寫大量前端代碼&#xff0c;就能將機器學習模型部署為可交互的網頁應用。以下是一個基于 Gradio 可視化部署機器學習應用的基本步驟&#xff1a; 安裝 Gradio&#xff1a; 首先&#xff0…

Springboot使用RabbitMQ實現關閉超時訂單的一個簡單示例

1.maven中引入rabbitmq的依賴&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency> 2.application.yml中進行rabbitmq相關配置&#xff1a; # rabbit…

AE Pinnacle 10x6 kW DeviceNet MDXL User r Manual

AE Pinnacle 10x6 kW DeviceNet MDXL User r Manual

vscode中調用deepseek實現AI輔助編程

來自 Python大數據分析 費弗里 1 簡介 大家好我是費老師&#xff0c;最近國產大模型Deepseek v3新版本憑借其優秀的模型推理能力&#xff0c;討論度非常之高&#x1f525;&#xff0c;且其官網提供的相關大模型API接口服務價格一直走的“價格屠夫”路線&#xff0c;性價比很高…

慧集通iPaaS集成平臺低代碼培訓-基礎篇

訓練使用素材&#xff1a; 1.數據源&#xff1a; 單號業務日期工廠倉庫物料單位數量批次0100012022-5-1210031001030001kg500202304150100012022-5-1210031001030001kg122202304150100012022-5-1210031001030001kg1250202304150100012022-5-1210031001030002kg130202304110100…