当前位置: 首页 > news >正文

C++ 第三阶段 并发与异步 - 第二节:异步任务(std::async)

目录

一、std::async 概述

1. std::async 的定义

二、std::async 的基本用法

1. 基本语法

(1) 函数调用

(2) Lambda 表达式

三、执行策略详解

1. std::launch::async

2. std::launch::deferred

3. 默认策略(std::launch::any)

四、std::future:异步结果管理

1. 获取结果的方法

五、异常处理与安全性

1. 异步任务中的异常

2. 避免资源泄漏

六、最佳实践

1. 显式指定执行策略

2. 合理使用超时机制

3. 避免共享状态竞争

七、常见问题与解决方案

1. 任务未执行

2. 性能问题

3. 异常未捕获

八、示例代码汇总

示例 1:基础异步任务

示例 2:超时等待

示例 3:多异步任务并行

九、总结

1. std::async 的核心优势

2. 适用场景

3. 后续学习方向

C++从入门到入土学习导航_c++学习进程-CSDN博客


一、std::async 概述

1. std::async 的定义

std::async 是 C++11 引入的高级异步任务管理工具,用于启动异步任务并返回一个 std::future 对象。其核心功能包括:

  • 自动管理线程:根据策略决定是否立即创建新线程或延迟执行。
  • 异步任务结果获取:通过 std::future 提供阻塞或非阻塞方式获取结果。
  • 灵活的执行策略:支持 std::launch::async(立即执行)和 std::launch::deferred(延迟执行)。

二、std::async 的基本用法

1. 基本语法

template<class Function, class... Args>
std::future<std::result_of_t<std::decay_t<Function>(std::decay_t<Args>...)>> 
async(Function&& f, Args&&... args);
(1) 函数调用
#include <iostream>
#include <future>int computeSum(int a, int b) {return a + b;
}int main() {auto future = std::async(computeSum, 3, 4); // 默认策略std::cout << "Result: " << future.get() << std::endl; // 阻塞直到结果可用return 0;
}
(2) Lambda 表达式
auto future = std::async([]() {return "Hello, async!";
});
std::cout << future.get() << std::endl;

三、执行策略详解

1. std::launch::async

  • 立即启动新线程:任务在独立线程中执行。
  • 适用场景:需要并行执行耗时操作(如计算、I/O)。
  • 示例
    auto future = std::async(std::launch::async, []() {std::this_thread::sleep_for(std::chrono::seconds(2));return 42;
    });

2. std::launch::deferred

  • 延迟执行:任务在调用 get() 或 wait() 时执行(可能在当前线程)。
  • 适用场景:轻量级任务或无需并行的场景。
  • 示例
    auto future = std::async(std::launch::deferred, []() {return "Deferred task";
    });
    std::cout << future.get() << std::endl; // 此时任务执行

3. 默认策略(std::launch::any

  • 由实现决定:可能选择异步或延迟策略(具体行为依赖编译器和平台)。
  • 示例
    auto future = std::async([]() { return 100; }); // 实现决定策略

四、std::future:异步结果管理

1. 获取结果的方法

  • get():阻塞当前线程,直到任务完成并返回结果。注意get() 只能调用一次。

    auto future = std::async([]() { return 5 * 5; });
    std::cout << "Result: " << future.get() << std::endl;
  • wait():阻塞直到任务完成(不返回结果)。

    auto future = std::async([]() { std::this_thread::sleep_for(1s); });
    future.wait(); // 等待任务完成
  • wait_for() / wait_until():带超时的等待。

    auto future = std::async([]() { std::this_thread::sleep_for(2s); });
    auto status = future.wait_for(1s); // 超时检查
    if (status == std::future_status::ready) {std::cout << "Task completed!" << std::endl;
    } else {std::cout << "Timeout!" << std::endl;
    }

五、异常处理与安全性

1. 异步任务中的异常

  • 如果异步任务抛出异常,调用 future.get() 时会重新抛出该异常。
  • 示例
    auto future = std::async([]() {throw std::runtime_error("Async error!");
    });
    try {future.get(); // 抛出异常
    } catch (const std::exception& e) {std::cerr << "Caught: " << e.what() << std::endl;
    }

2. 避免资源泄漏

  • 必须调用 get() 或 wait():未调用会导致线程资源未释放。
  • 示例
    {auto future = std::async([]() { return 100; });future.get(); // 必须调用
    }

六、最佳实践

1. 显式指定执行策略

  • 避免默认策略的不确定性:优先使用 std::launch::async
    auto future = std::async(std::launch::async, heavyComputation, args...);

2. 合理使用超时机制

  • 防止无限阻塞:结合 wait_for() 或 wait_until()
    auto future = std::async(std::launch::async, longRunningTask);
    if (future.wait_for(5s) == std::future_status::ready) {processResult(future.get());
    } else {std::cerr << "Task timeout!" << std::endl;
    }

3. 避免共享状态竞争

  • 使用锁或原子类型:保护共享数据。
    std::mutex mtx;
    auto task1 = std::async([&]() {std::lock_guard<std::mutex> lock(mtx);sharedData++;
    });

七、常见问题与解决方案

1. 任务未执行

  • 原因:使用 std::launch::deferred 但未调用 get() 或 wait()
  • 解决方案:显式调用 get()
    auto future = std::async(std::launch::deferred, []() { return 10; });
    future.get(); // 必须调用

2. 性能问题

  • 原因:频繁创建短生命周期线程。
  • 解决方案:使用线程池(需自行实现)。
    // 示例:伪代码,实际需实现线程池
    class ThreadPool {
    public:// 构造函数:启动指定数量的工作线程ThreadPool(size_t numThreads) : stop(false) {for (size_t i = 0; i < numThreads; ++i) {workers.emplace_back([this] { this->worker(); });}}// 析构函数:停止所有线程,确保资源释放~ThreadPool() {{std::unique_lock<std::mutex> lock(queue_mutex);stop = true;}condition.notify_all();for (std::thread& worker : workers) {if (worker.joinable()) {worker.join();}}}// 提交任务:支持任意可调用对象 + 参数,返回 future 结果template<typename F, typename... Args>auto enqueue(F&& f, Args&&... args) -> std::future<typename std::result_of<F(Args...)>::type> {using return_type = typename std::result_of<F(Args...)>::type;auto task = std::make_shared<std::packaged_task<return_type()>>(std::bind(std::forward<F>(f), std::forward<Args>(args)...));{std::unique_lock<std::mutex> lock(queue_mutex);tasks.push([task]() { (*task)(); });}condition.notify_one();return task->get_future();}private:// 工作线程主循环:等待任务并执行void worker() {while (true) {std::function<void()> task;{std::unique_lock<std::mutex> lock(queue_mutex);condition.wait(lock, [this] { return stop || !tasks.empty(); });if (stop && tasks.empty()) return;task = std::move(tasks.front());tasks.pop();}task();}}std::vector<std::thread> workers;           // 工作线程池std::queue<std::function<void()>> tasks;    // 任务队列std::mutex queue_mutex;                     // 保护任务队列的互斥锁std::condition_variable condition;          // 同步任务队列的条件变量bool stop;                                   // 是否停止线程池
    };

3. 异常未捕获

  • 原因:未处理异步任务的异常。
  • 解决方案:在 get() 调用时捕获异常。
    try {future.get();
    } catch (...) {std::cerr << "Unexpected error!" << std::endl;
    }

八、示例代码汇总

示例 1:基础异步任务

#include <iostream>
#include <future>
#include <thread>int computeSquare(int x) {return x * x;
}int main() {auto future = std::async(std::launch::async, computeSquare, 5);std::cout << "Computing square..." << std::endl;std::cout << "Result: " << future.get() << std::endl;return 0;
}

示例 2:超时等待

#include <iostream>
#include <future>
#include <chrono>void longRunningTask() {std::this_thread::sleep_for(std::chrono::seconds(3));
}int main() {auto future = std::async(std::launch::async, longRunningTask);std::cout << "Waiting for task..." << std::endl;auto status = future.wait_for(std::chrono::seconds(2));if (status == std::future_status::ready) {std::cout << "Task completed!" << std::endl;} else {std::cout << "Task not ready yet!" << std::endl;}return 0;
}

示例 3:多异步任务并行

#include <iostream>
#include <future>
#include <vector>
#include <thread>int computeSum(int a, int b) {return a + b;
}int main() {std::vector<std::future<int>> futures;for (int i = 0; i < 5; ++i) {futures.push_back(std::async(std::launch::async, computeSum, i, i * 2));}for (auto& future : futures) {std::cout << "Result: " << future.get() << std::endl;}return 0;
}

九、总结

1. std::async 的核心优势

  • 简化线程管理:自动处理线程创建和销毁。
  • 灵活的执行策略:支持异步和延迟两种模式。
  • 结果安全获取:通过 std::future 提供阻塞和非阻塞接口。

2. 适用场景

  • 后台任务:如文件读写、网络请求、计算密集型任务。
  • 并行处理:同时执行多个独立任务。
  • 异步结果获取:避免主线程阻塞,提升程序响应性。

3. 后续学习方向

  • 高级同步机制:如 std::condition_variablestd::atomic
  • 线程池实现:优化 std::async 的性能瓶颈。
  • 异步任务链:结合 std::future 和 std::promise 实现复杂任务依赖。

通过掌握 std::async,开发者可以高效管理异步任务,提升程序的并发性能和响应能力,为构建复杂的多线程应用打下坚实基础。

相关文章:

C++ 第三阶段 并发与异步 - 第二节:异步任务(std::async)

目录 一、std::async 概述 1. std::async 的定义 二、std::async 的基本用法 1. 基本语法 (1) 函数调用 (2) Lambda 表达式 三、执行策略详解 1. std::launch::async 2. std::launch::deferred 3. 默认策略&#xff08;std::launch::any&#xff09; 四、std::futur…...

OpenCV图像添加水印

一、前言 在数字图像处理中&#xff0c;为图片添加水印是一项常见且重要的技术。无论是版权保护、品牌宣传还是防止未经授权的使用&#xff0c;水印都能发挥重要作用。OpenCV作为一款强大的计算机视觉库&#xff0c;提供了丰富的功能来实现各种水印效果。本教程将详细介绍如何…...

Linux信号机制:从入门到精通

嘿&#xff0c;小伙伴们&#xff01;今天我要和大家聊一个Linux系统中非常有趣又重要的话题——信号机制。别担心&#xff0c;虽然信号听起来有点高深&#xff0c;但我会用最通俗易懂的语言&#xff0c;配合清晰的图表&#xff0c;带你彻底搞懂这个概念&#xff01; 什么是信号…...

EXCEL数据报表

客单价成交金额*成交客户数 —— 提取年份 YEAR() 视图-窗口-新建窗口&#xff0c;就能将excel的一个子表格单拎出来成为独立窗口&#xff0c;方便对比查看 数据报表的单元格尽量都用公式来填补&#xff0c;链接到源表上去。这样当源表有新数据更新进来后&#xff0c;报表也…...

openGL学习(VAO和VBO)

理论 VBO void prepare() {//创建一个VBO,但是还没有分配显存GLuint vbo 0;GL_CALL( glGenBuffers(1, &vbo));cout << "vbo " << vbo << endl;//销毁一个VBOGL_CALL(glDeleteBuffers(1, &vbo));cout << "delete vbo "…...

【请关注】制造企业机械加工数据脱敏解决方案

制造企业机械加工数据脱敏解决方案 一、方案概述 在制造企业尤其是机械加工领域,数字化转型带来了生产效率的大幅提升,大量生产数据、设备运行数据、供应链数据以及客户订单数据等成为企业发展的关键驱动力。然而,这些数据中包含众多敏感信息,如客户定制产品的设计图纸(…...

2025.6.27总结

最近工作又开始内耗了&#xff0c;一位同事的转岗直接让我破防了&#xff0c;明明他工作干得很不错&#xff0c;会得又多&#xff0c;性格又好&#xff0c;我还经常请教他业务上的问题。我和他的关系并不算太好&#xff0c;但他加入其他部门&#xff0c;竟然让我有些不舍&#…...

Python打卡:Day38

知识点回顾&#xff1a; Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09;Dataloader类minist手写数据集的了解 浙大疏锦行...

Ubuntu18.04/Mysql 5.7 建立主备模式Mysql集群

一、数据库的安装 详见https://www.jianshu.com/p/5073177eedf2 本文实验环境为阿里云的两台ubuntu18.04服务器&#xff1a; master ip: 172.26.138.7 slave ip: 172.26.0.209 二、修改Master的配置(# 的行是我后增加的部分)&#xff1a; 编辑 /etc/mysql/mysql.conf.d/mysqld.…...

Linux journal 日志大小限制与管理详解

文章目录 Linux journal 日志大小限制与管理详解journal 日志的默认存储位置journal 日志大小限制配置查看当前日志占用情况手动清理日志文件按大小清理日志按时间清理日志按文件数清理日志 journald 日志机制原理简析&#xff08;适当加点原理&#xff09;日志筛选与导出技巧&…...

Linux基本指令篇 —— tac指令

tac 是 Linux 系统中一个非常实用的文本处理命令&#xff0c;它是 cat 命令的反向操作&#xff08;名称也是 "cat" 的反写&#xff09;。tac 是一个简单但功能强大的工具&#xff0c;特别适合需要反向处理文本数据的场景&#xff1a; 目录 一、基本功能 二、基本语法…...

【Yonghong 企业日常问题08 】永洪BI的Apache Tomcat版本升级指南

文章目录 前言操作步骤登录验证 前言 某公司业务永洪BI系统使用tomcat 9.0.97版本&#xff0c;接到总公司漏洞扫描整改要求需要将tomcat版本升级到9.0.97以上。 目标&#xff1a;tomcat 9.0.97》 9.0.98 1、下载tomcat所需要的版本 地址:https://tomcat.apache.org/download-…...

动手学Python:从零开始构建一个“文字冒险游戏”

动手学Python&#xff1a;从零开始构建一个“文字冒险游戏” 大家好&#xff0c;我是你的技术向导。今天&#xff0c;我们不聊高深的框架&#xff0c;也不谈复杂的算法&#xff0c;我们来做一点“复古”又极具趣味性的事情——用Python亲手打造一个属于自己的文字冒险游戏&…...

【C/C++】C++26新特性前瞻:全面解析未来编程

展望未来&#xff1a;C26 新特性全面解析 随着 C 标准每三年一次的迭代节奏&#xff0c;C26&#xff08;预计于 2026 年底正式发布&#xff09;正在逐步成型。相比 C20 的革命性更新和 C23 的“修补增强”&#xff0c;C26 继续推进现代 C 的理念——更安全、更高效、更模块化&…...

Linux系统日志与守护进程开发实战指南

Linux系统日志与守护进程开发实战指南 系统日志与守护进程 ├── 系统日志syslog │ ├── 日志路径: /var/log/syslog │ └── 核心API │ ├── openlog │ ├── syslog │ └── closelog └── 守护进程daemon└── 创建步骤├── um…...

兰洋科技上合组织论坛发表专题分享,全球液冷布局引领绿色算力未来

2025年6月17-19日&#xff0c;中国—上海合作组织数字技术合作发展论坛在新疆克拉玛依市举办。作为第四次上海合作组织成员国信息通信技术发展部门负责人会议的配套会议&#xff0c;论坛以“数字化转型助力可持续发展&#xff0c;数字包容促进上合共同繁荣”为主题&#xff0c;…...

桌面小屏幕实战课程:DesktopScreen 11 SPI 水墨屏

飞书文档https://x509p6c8to.feishu.cn/docx/doxcnlzpIgj3gosCZufBTCZxlMb SPI说明 SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上占用…...

小知识点五、无刷电机闭环控制(电流)

0 前言 该部分只用于自学使用&#xff0c;作为笔记方便后续自查。 资料参考&#xff1a;http://dengfoc.com 硬件&#xff1a;2208云台电机MT6701磁编码器 1 电流控制理论 1.1 待解决的问题 简单回顾一下在之前的学习中&#xff0c;我们通过 U q U_q Uq​和电角度 θ \the…...

Java 编程之备忘录模式

前言 有时候&#xff0c;我们真希望人生能有“CtrlZ”。在日常生活中&#xff0c;我们经常使用“撤销”功能&#xff0c;例如在写 Word、画图、写代码时一不小心操作失误&#xff0c;就希望能回到之前的状态。这种**“状态快照 恢复”**机制&#xff0c;在设计模式中就叫做&a…...

SQL SERVER存储过程

什么是存储过程 SQL 存储过程&#xff08;Stored Procedure&#xff09;是一个在数据库中预编译并存储的一组 SQL 语句。它们可以包含查询、插入、更新、删除等数据库操作&#xff0c;甚至包括控制流语句&#xff08;如条件判断、循环等&#xff09;。存储过程可以通过调用来执…...

Vue样式绑定与条件渲染详

一、Vue样式绑定 在Vue中&#xff0c;我们可以通过多种方式动态地绑定样式&#xff0c;让界面根据数据状态变化而自动更新样式。 1. class样式绑定 (1) 字符串写法 适用场景&#xff1a;样式的类名不确定&#xff0c;需要动态指定 <template><div><!-- 绑定…...

python基于协同过滤的动漫推荐系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…...

光场操控新突破!3D 光学信息处理迎来通用 PSF 工程时代--《自然》子刊:无需复杂算法,这一技术让 3D 光学成像实现 “即拍即得”念日

导语 在光学成像领域&#xff0c;如何突破分辨率与成像速度的瓶颈&#xff0c;一直是科研人员探索的焦点。近日&#xff0c;加州大学洛杉矶分校&#xff08;UCLA&#xff09;的研究团队在《Light: Science & Applications》发表论文&#xff0c;提出了一种通用点扩散函数&a…...

ubuntu20.04如何给appImage创建快捷方式

ubuntu20.04如何给appImage创建快捷方式 1. 确保AppImage是可执行的 chmod x /path/to/your/appimage2. 创建.desktop文件 在~/.local/share/applications/目录下创建一个新的 .desktop 文件&#xff1a; vi ~/.local/share/applications/your-appname.desktop添加以下内容…...

网络安全之SQL RCE漏洞

引言 堡垒机&#xff08;Bastion Host&#xff09;&#xff0c;也称为跳板机或运维安全审计系统&#xff0c;是一种用于管理和控制对内部网络资源访问的安全设备。它的主要作用是作为运维人员访问内部服务器和网络设备的唯一入口&#xff0c;通过集中化的身份认证、权限管理和…...

DeepSeek网页版随机点名器

用DeepSeek帮我们生成了一个基于html5的随机点名器&#xff0c;效果非常棒&#xff0c;如果需要加入名字&#xff0c;请在代码中按照对应的格式添加即可。 提示词prompt 帮我生成一个随机点名的HTML5页面 生成真实一点的名字数据 点击随机按钮开始随机选择 要有闪动的效果 &…...

Elasticsearch索引字段的类型

在 Elasticsearch 中&#xff0c;索引字段的类型&#xff08;即 Mapping 中的字段类型&#xff09;对搜索和存储性能影响很大。下面是各种常用数据类型的用途及推荐使用场景总结&#xff1a; 1. keyword 类型&#xff08;精确匹配&#xff09; 适合数据&#xff1a; 不需要分词…...

大模型在慢性病毒性肝炎预测及诊疗方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、慢性病毒性肝炎概述 2.1 疾病定义与分类 2.2 发病机制与病理特征 2.3 流行病学现状 三、数据收集与预处理 3.1 数据来源 3.2 数据清洗 3.3 特征工程 四、大模型选择与构建 4.1 模型选择依据 4.2 模型…...

DAY 43 复习日

浙大疏锦行https://blog.csdn.net/weixin_45655710 第一步&#xff1a;寻找并准备图像数据集 在Kaggle等平台上&#xff0c;你可以找到大量用于图像分类任务的数据集&#xff0c;例如英特尔图像分类数据集 (Intel Image Classification) 或手写数字识别数据集 (Digit Recogni…...

SQL学习笔记3

SQL常用函数 1、字符串函数 函数调用的语法&#xff1a;select 函数&#xff08;参数); 常用的字符串函数有&#xff1a; 拼接字符串&#xff0c;将几个字符串拼到一起&#xff1a;concat (s1,s2,……); select concat(你好,hello); update mytable set wherefo concat(中…...

JVM调优实战 Day 7:JVM线程分析与死锁排查

【JVM调优实战 Day 7】JVM线程分析与死锁排查 文章标签 jvm调优, 线程分析, 死锁排查, JVM监控, Java性能优化, JVM参数配置 文章简述 在Java应用的高并发场景中&#xff0c;线程管理与死锁问题往往是性能瓶颈的根源。本文作为“JVM调优实战”系列的第7天&#xff0c;深入解析…...

Android-Layout Inspector使用手册

Layout Inspector Android Layout Inspector 是 Android Studio 中用于调试应用布局的工具 启动方法&#xff1a; 通过下载Layout Inspector插件&#xff0c;在 “View - Tool Windows - Layout Inspector” 或 “Tools - Layout Inspector” 启动。 主要界面区域&#xff1a…...

【51单片机5毫秒定时器】2022-6-1

缘由单片机的代码&#xff0c;求大家来帮帮我-编程语言-CSDN问答 #include "REG52.h" unsigned char code smgduan[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,64}; //共阴0~F消隐减号 unsigned char Js0, miao0;//中断…...

Flutter 多平台项目开发指南

Flutter 多平台项目开发指南 本指南将帮助你从 0 到 1 创建并适配一个支持 Android / iOS / Web / Windows / macOS / Linux 的 Flutter 多平台项目。 ✅ 一、创建支持多平台的 Flutter 项目 flutter create my_multi_platform_app cd my_multi_platform_app默认会生成支持以…...

Mac电脑如何搭建基于java后端的开发的各种工具服务

1. 确认Mac的CPU架构 首先&#xff0c;确认您的Mac是使用Intel还是Apple Silicon&#xff08;如M1芯片&#xff09;架构&#xff1a; uname -m如果返回x86_64&#xff0c;表示是Intel架构。如果返回arm64&#xff0c;表示是Apple Silicon架构。 2.安装IDEA Download Intelli…...

深入解析前端 Meta 标签:HTML 的隐形守护者与功能大师

在构建现代网页时&#xff0c;我们常常关注炫目的视觉效果、复杂的交互逻辑或强大的框架&#xff0c;却容易忽略那些深藏于 <head> 之中、看似不起眼的 <meta> 标签。这些标签如同网页的隐形守护者&#xff0c;无声地承担着定义文档元数据、指导浏览器行为、优化搜…...

CRON表达式编辑器与定时任务实现技术文档

1. 前端CRON表达式编辑器组件 CronExpressionEditor.vue组件是系统中用于创建和编辑CRON表达式的核心UI组件&#xff0c;它提供了直观的界面来生成复杂的定时任务表达式。 1.1 组件结构与状态管理 // 核心状态变量 const second ref<string>(0); const minute ref&…...

45. 跳跃游戏 II

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最…...

《解锁AudioSet:开启音频分析的无限可能》

音频新时代的 “密钥”&#xff1a;AudioSet 登场 在科技飞速发展的今天&#xff0c;音频作为信息传播与交互的关键媒介&#xff0c;早已渗透到现代科技的各个角落。从智能手机中的语音助手&#xff0c;让我们通过简单的语音指令就能查询信息、发送消息&#xff0c;到智能家居系…...

环境太多?不好管理怎么办?TakMll 工具帮你快速切换和管理多语言、多版本情况下的版本切换。

本篇文章主要介绍一款环境管理工具&#xff0c;即TakMll&#xff0c;通过简单的入口命令 “tkm” 即可快速的管理多种语言下、多种版本的环境切换&#xff0c;诸如快速切换PHP、同时存在java、mave等不同版本。 作者&#xff1a;任聪聪 日期&#xff1a;2025年6月26日 TakMll 特…...

spring-ai 1.0.0 (1)模型调用能力

听说1.0是一个非常好用的版本&#xff0c;最后还是扛不住听说的压力&#xff0c;为了落实自己悬浮心理&#xff0c;自己还是着手实践一下了。 第一步pom集成&#xff1a; 参考spring-projects/spring-ai | DeepWiki维基以及官方文档入门 &#xff1a;&#xff1a; Spring AI …...

如何在 Manjaro Linux 上启用 AUR 仓库来安装软件包

Manjaro 是基于 Arch 的系统&#xff0c;是了解和学习 Arch Linux 命令的绝佳方式。它自带所有流行的桌面环境界面&#xff0c;无论是 XFCE 还是 Gnome 的爱好者&#xff0c;都可以在 Manjaro 中直接使用。 Manjaro 或 Arch Linux 的默认软件包管理器是 Pacman&#xff0c;我们…...

简单使用python

本文章没有深入探讨python&#xff0c;只说语法格式&#xff0c;合适于有其他编程语言的基础、并想快速使用python的人查看。 一、print() 用于打印信息&#xff0c;括号中可以是数学运算表达式或者字符串&#xff08;或者说是文字&#xff09;。 print(hello!) 1.1、转义字…...

2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝

2025服务端java搭建篇&#xff1a;蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝 前言 蜻蜓I即时通讯系统是一款不依赖第三方服务的私有化即时通讯解决方案&#xff0c;本指南将详细介绍如何使用宝塔面板在CentOS系统上完成系统的完整部署。私有化部署意味着您…...

用Streamlit开发第一个Python应用程序

用Streamlit开发第一个Python应用程序 Using Streamlit to Develop the First Application in Python By JacksonML 1.Streamlit简介 Streamlit是个新出世的、功能强大的Python第三方库&#xff0c;将为基于Web的Python应用程序大放异彩。 Streamlit官网主页面如下&#x…...

IDEA + Spring Boot + javadoc 实例应用

1、添加 javadoc 插件 依赖 pom.xml <build><plugins><!-- javadoc 插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-javadoc-plugin</artifactId><version>3.6.3</version><…...

【机器学习深度学习】交互式线性回归 demo

目录 一、环境准备 二、Demo 功能 三、完整交互 demo 代码 3.1 执行代码 3.2 示例交互演示 3.3 运行结果 3.4 运行线性图 使用 PyTorch 构建交互式线性回归模型&#xff1a;输入数据、拟合直线、图像可视化并实现实时预测&#xff0c;助你深入理解机器学习从数据到模型的…...

新手向:Anaconda3的安装与使用方法

我们在刚开始接触Python时使用的是Python的直接编译器,如果我们需要进行其他的项目编写往往需要使用另一个版本的Python ,这样反复的下载很是麻烦并且还会造成系统变量的紊乱.这次我们引入Anaconda3,可创建虚拟的Python环境,满足不同项目的需要,当不用的时候可以直接放心删除不…...

详解零拷贝

目录 一、用户态&#xff08;User Mode&#xff09;和内核态&#xff08;Kernel Mode&#xff09; 1.1 用户态 (User Mode)&#xff1a; 1.2 内核态 (Kernel Mode)&#xff1a; 1.3 关键交互&#xff1a;系统调用 (System Call) 二、为什么需要区分用户态和内核态&#x…...

微服务常用的基础知识

1.微服务介绍 1.1 产生背景 随着互联网的发展&#xff0c;网站应用的规模不断扩大&#xff0c;传统单体架构逐渐难以应对大型网站高并发、高扩展性等需求&#xff0c;于是分布式系统架构应运而生。Spring Cloud 就是在这种背景下诞生的&#xff0c;它利用 Spring Boot 的开发便…...