线程池的创建规范

第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.mzph.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…