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

2505C++,py和go调用雅兰亭库的协程工具

原文

神算调用C++

一般调用pybind11封装的C++库实现神算调用C++库,pybind11封装c++的接口很简单.

创建一个py_example.cpp文件

#include <pybind11/pybind11.h>
#include <string>
namespace py = pybind11;
PYBIND11_MODULE(py_example, m) {m.def("hello", [] {return std::string("hello");});
}

通过cmake去编译成动态库:

pybind11_add_module(py_example py_example/py_example.cpp)

神算调用pybind11封装的你好函数:

import py_example
print(py_example.hello())

通过pybind11,几行代码就可实现神算调用c++了.
如果要同步调用coro_http_client还是很简单的,封装一个函数就完了.
但是如果要异步调用,事情就不是则简单了,coro_httpcoro_rpc都是协程异步的,如何把C++``协程神算协程结合起来却不容易,当前通过回调函数神算asynio未来来实现的.

每次调用C++协程函数之前创建一个未来和设置一个回调函数,当协程返回时设置未来,神算侧则等待未来.
神算调用coro_http_client为例:

#include <pybind11/pybind11.h>
#include <string>
#include <ylt/coro_http/coro_http_client.hpp>
#include <ylt/coro_io/client_pool.hpp>
namespace py = pybind11;
class caller {public:caller(py::function callback) : callback_(std::move(callback)) {}void async_get(std::string url) {static auto pool =coro_io::client_pool<coro_http::coro_http_client>::create(url);pool->send_request([this, url](coro_http::coro_http_client &client) -> async_simple::coro::Lazy<void> {auto result = co_await client.async_get(url);py::gil_scoped_acquire acquire;callback_(result.resp_body);}).start([](auto &&) {});}private:py::function callback_;
};PYBIND11_MODULE(py_example, m) {py::class_<caller>(m, "caller").def(py::init<py::function>()).def("async_get", &caller::async_get,py::call_guard<py::gil_scoped_release>());
}

pybind11不支持封装一个协程函数,因此需要通过一个普通函数去调用协程,即使用回调方式调用协程,在协程回调函数中设置神算未来.
通过一个调用者类来实现调用C++``协程.

创建调用者类时传入一个神算回调函数,在async_get方法中通过回调方式调用client_pool中的send_request``协程,并在其回调函数co_await客户的请求,请求结束后设置回调函数.

注意的是神算GIL锁,调用回调函数时需要加锁.

为何需要一个调用者对象来保存回调函数,而不是按函数的参数传入呢回调函数?试过,但因为回调函数的生命期的问题,不好解决,在内部的λ移动或拷贝它,总会出现pybind11对象释放的错误.
调用者里放置,由神算去管理调用者回调生命期就没问题了.

神算侧,通过协程去调用coro_http_client有点麻烦了,需要创建一个未来并设置调用者回调函数,并在回调函数中设置未来的值:

import asyncio
import py_example
async def async_get(url):loop = asyncio.get_running_loop()future = loop.create_future()def cpp_callback(message):def set_result():future.set_result(message)loop.call_soon_threadsafe(set_result)caller = py_example.caller(cpp_callback)caller.async_get(url)result = await futureprint(result)async def main():await async_get("http://taobao.com")if __name__ == "__main__":asyncio.run(main())

虽然有点复杂,但工作了,如果大家有更好的神算``协程C++20``协程结合的方法也请留言告诉我.

go调用C++

相比较而言,因为go协程用起来比较方便,而且go更期望调用的是同步接口,因为go总可在go协程中执行同步方法,因此用go来封装coro_rpc``简单一些.

先按c接口封装coro_rpc,然后通过cgo去调用这些c接口,等待异步函数结束时,放进go协程中即可.

封装coro_http_server的c接口

创建和结束coro_http_server

extern void *start_rpc_server(char *addr, int parallel);
extern void stop_rpc_server(void *server);

注册rpc函数和回调

coro_rpc_server需要注册一个,需要根据用户自己的需求来实现的rpc函数,来提供rpc服务,比如有一个加载rpc服务:

inline void ylt_load_service(coro_rpc::context<void> context, uint64_t req_id) {//做`CPP`业务
}

在创建rpcserver后,注册该rpc函数:

void *start_rpc_server(char *addr, int parallel) {auto server = std::make_unique<coro_rpc::coro_rpc_server>( parallel, addr, std::chrono::seconds(600));server->register_handler<ylt_load_service>();//注册`rpc`函数auto res = server->async_start();if (res.hasResult()) {ELOG_ERROR << "start server failed";return nullptr;}return server.release();
}

这里注意,该rpc函数需要转到go那里去执行go业务逻辑,而不是在c++这一侧去写业务逻辑,因此需要在go中回调.

extern void load_service(void *ctx, uint64_t req_id);
inline void ylt_load_service(coro_rpc::context<void> context, uint64_t req_id) {auto ctx_ptr = std::make_unique<coro_rpc::context<void>>(std::move(context));load_service(ctx_ptr.release(), req_id);
}

注意该只有声明的load_service,就是通过它回调到go的,具体实现go那里,所以这里只有个声明,cgo支持这样.

另外一个细节是,为何使用coro_rpc::context呢?因为是rpc函数是回调到go那里处理的,go那里何时处理完业务,c++这边是不知道的,所以需要该环境go那里处理完业务逻辑之后发送rpc响应.

go实现的load_service:

    //导出`load_service`
func load_service(ctx unsafe.Pointer, req_id C.uint64_t) {//fmt.Println("load req_id", req_id);//go代码if(req_id == 2) {var err_msg = C.CString("error from server")C.response_error(ctx, 1001, err_msg)C.free(unsafe.Pointer(err_msg))return;}//响应`RPC`结果var promise = C.response_msg(ctx, ((*C.char)(unsafe.Pointer(&g_resp_buf[0]))), C.uint64_t(len(g_resp_buf)));go func(p unsafe.Pointer, buf []byte) {result := C.wait_response_finish(p);if(result.ec > 0) {fmt.Println(result.ec, C.GoString(result.err_msg))C.free(unsafe.Pointer(result.err_msg))}//现在释放`缓冲`}(promise, g_resp_buf)
}

因为response_msg异步发送消息的,go这边需要稍微等待一下,等发送完成之后再清理发送数据等资源.这里是通过一个go协程来等待发送完成.

封装coro_http_client的c接口

extern void *create_client_pool(char *addr, int req_timeout_sec);
extern void free_client_pool(void *pool);
extern rpc_result load(void *pool, uint64_t req_id, char *dest, uint64_t dest_len);

客户端的封装简单一些,创建clientpool,释放clientpool,并调用rpcload的接口.看一下调用的实现:

rpc_result load(void *pool, uint64_t req_id, char *dest, uint64_t dest_len) {using namespace async_simple::coro;rpc_result ret{};auto ld = (coro_io::load_balancer<coro_rpc::coro_rpc_client> *)pool;auto lazy = [&]() -> Lazy<void> {auto result =co_await ld->send_request([&](coro_rpc::coro_rpc_client &client, std::string_view hostname) -> Lazy<void> {client.set_resp_attachment_buf(std::span<char>(dest, dest_len));auto result = co_await client.call<ylt_load_service>(req_id);if (!result) {set_rpc_result(ret, result.error());co_return;}if (!client.is_resp_attachment_in_external_buf()) {set_rpc_result(ret, coro_rpc::rpc_error(coro_rpc::errc::message_too_large));co_return;}ret.len = client.get_resp_attachment().size();});};syncAwait(lazy());return ret;
}

通过clientpool发送请求,内部同步等待rpc调用结束,go那里则可在一个go协程中放置该加载调用.

这里展示一个如何实现rpc请求零拷贝的场景:

client.set_resp_attachment_buf(std::span<char>(dest, dest_len));

设置附件是为了零拷贝,附件的内存可能是来自于go那里的一块很大的内存,并在附件中放置,coro_rpc_client发送请求时不会去序化它的,而是直接发送到服务器.

go那里调用加载比较简单了:

func test_client(host string, len int) {peer := C.CString(host)pool := C.create_client_pool(peer, C.int(30))outbuf := make([]byte, len)for i := 0; i < 3; i++ {req_id := uint64(i)result := C.load(pool, C.uint64_t(req_id), ((*C.char)(unsafe.Pointer(&outbuf[0]))), C.uint64_t(len))if(result.ec > 0) {fmt.Println("error: ", result.ec, C.GoString(result.err_msg))C.free(unsafe.Pointer(result.err_msg))}else {fmt.Println("result: ", string(outbuf[0:result.len]), "len", result.len)}}C.free_client_pool(pool)C.free(unsafe.Pointer(peer))
}
test_client("0.0.0.0:8806", 1024)

相关文章:

2505C++,py和go调用雅兰亭库的协程工具

原文 神算调用C 一般调用pybind11封装的C库实现神算调用C库,pybind11封装c的接口很简单. 创建一个py_example.cpp文件 #include <pybind11/pybind11.h> #include <string> namespace py pybind11; PYBIND11_MODULE(py_example, m) {m.def("hello", …...

题解:P12207 [蓝桥杯 2023 国 Python B] 划分

链接 题目描述 给定 40 个数&#xff0c;请将其任意划分成两组&#xff0c;每组至少一个元素。每组的权值为组内所有元素的和。划分的权值为两组权值的乘积。请问对于以下 40 个数&#xff0c;划分的权值最大为多少。 5160 9191 6410 4657 7492 1531 8854 1253 4520 9231126…...

英迈国际Ingram Micro EDI需求分析

Ingram Micro&#xff08;英迈国际&#xff09;成立于1979年&#xff0c;是全球领先的技术和供应链服务提供商&#xff0c;总部位于美国加州尔湾。公司致力于连接全球的技术制造商与渠道合作伙伴&#xff0c;业务涵盖IT分销、云服务、物流和供应链优化等多个领域。Ingram Micro…...

【Linux】网络基础与socket编程基础

一.网络发展 计算机的出现是在网络之前的。而网络产生之初就是为了解决局部计算机无法交互的问题。所以&#xff0c;网络在诞生之初&#xff0c;最先出现的就是我们的局域网LAN&#xff0c;用来结局局部多台计算机的通信问题。 而随着时间的推移&#xff0c;局域网已经不能满…...

漂亮的收款打赏要饭网HTML页面源码

这是一款专为个人收款及接受打赏设计的HTML页面&#xff0c;其设计简洁且美观。 下载地址&#xff1a;漂亮的收款打赏要饭网HTML页面源码 备用地址&#xff1a;漂亮的收款打赏要饭网HTML页面源码...

【图书推荐】几本人工智能实用性图书

《OpenCV计算机视觉开发实践&#xff1a;基于Python》 《OpenCV计算机视觉开发实践:基于Python》【摘要 书评 试读】- 京东图书 《PyTorch深度学习与计算机视觉实践》 《PyTorch深度学习与计算机视觉实践&#xff08;人工智能技术丛书&#xff09;》(王晓华)【摘要 书评 试读…...

uniapp+vite+cli模板引入tailwindcss

目前vitecli方式用的都是官方提供的模板&#xff0c;vite版本还是4.14版本&#xff0c;较旧&#xff0c;而tailwindcss已经有了4版本&#xff0c;实际发现引入最新版会报错&#xff0c;因而继续使用3.3.5版本 pnpm install tailwindcss3.3.5 uni-helper/vite-plugin-uni-tail…...

【使用 C# 获取 USB 设备信息及进行通信】

文章目录 使用 C\# 获取 USB 设备信息及进行通信为什么需要获取 USB 设备信息&#xff1f;方法一&#xff1a;使用 C\# 库 (推荐)1. HidSharp2. LibUsbDotNet 方法二&#xff1a;直接调用 Windows API (P/Invoke)理解设备通信协议 (用于数据交换)总结 使用 C# 获取 USB 设备信息…...

Spring Cloud探索之旅:从零搭建微服务雏形 (Eureka, LoadBalancer 与 OpenFeign实战)

引言 大家好&#xff01;近期&#xff0c;我踏上了一段深入学习Spring Cloud构建微服务应用的旅程。我从项目初始化开始&#xff0c;逐步搭建了一个具备服务注册与发现、客户端负载均衡以及声明式服务调用功能的基础微服务系统。本文旨在记录这一阶段的核心学习内容与实践成果…...

四维时空数据安全传输新框架:压缩感知与几何驱动跳频

四维时空数据安全传输新框架&#xff1a;压缩感知与几何驱动跳频 1. 引言 1.1 研究背景 随着三维感知技术&#xff08;如激光雷达、超宽带定位&#xff09;与动态数据流&#xff08;如无人机集群、工业物联网&#xff09;的快速发展&#xff0c;四维时空数据&#xff08;三维…...

CSS相关知识补充

:root伪类 css自定义变量和var()引用自定义变量 https://developer.mozilla.org/zh-CN/docs/Web/CSS/var 在 SCSS 中&#xff0c;变量的声明和使用是用 $ 符号&#xff0c;比如&#xff1a; $primary-color: #ff5722;.button {color: $primary-color; }SCSS 里没有 var() 这…...

DeepSeek 赋能物联网:从连接到智能的跨越之路

目录 一、引言&#xff1a;物联网新时代的开启二、DeepSeek 技术揭秘2.1 DeepSeek 是什么2.2 DeepSeek 技术优势 三、DeepSeek 与物联网的融合之基3.1 物联网发展现状与挑战3.2 DeepSeek 带来的变革性突破 四、DeepSeek 在物联网的多元应用场景4.1 智慧电力&#xff1a;开启能源…...

谷歌量子计算机:开启计算新纪元

量子计算的黎明​ ​ 原始尺寸更换图片 ​​ 在科技迅猛发展的时代&#xff0c;量子计算作为前沿领域&#xff0c;正逐渐崭露头角&#xff0c;吸引着全球无数科研人员与科技巨头的目光。它宛如一把开启未来科技大门的钥匙&#xff0c;为解决诸多复杂难题提供了前所未有的可…...

桃芯ingchips——windows HID键盘例程无法同时连接两个,但是安卓手机可以的问题

目录 环境 现象 原理及解决办法 环境 PC&#xff1a;windows11 安卓&#xff1a;Android14 例程使用的是HID Keyboard&#xff0c;板子使用的是91870CQ的开发板&#xff0c;DB870CC1A 现象 连接安卓手机时并不会出现该现象&#xff0c;两个开发板都可以当做键盘给手机发按…...

AMC8 -- 2009年真题解析(中文解析)

Problem 1 Answer: E 中文解析&#xff1a; Bridget最后有4个&#xff0c;给了Cassie3个&#xff0c; 则给Cassie之前有7个。在此之前给了一半的苹果给Ann&#xff0c; 那么在给Anna之前&#xff0c;他有7*214个苹果。 因此答案是E。 Problem 2 Answer: D 中文解析&#xff1…...

深入解析CountDownLatch的设计原理与实现机制

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、概述 CountDownLatch是Java并发包&#xff08;java.util.concurrent&#xff09;中用于协调多线程同步的核心工具类&#xff0c;其设计目标是允许一个或…...

缓存的相关内容

缓存是一种介于数据永久存储介质与数据应用之间数据临时的存储介质 实用化保存可以有效地减少低俗数据读取的次数 (例如磁盘IO), 提高系统性能 缓存不仅可以用于提高永久性存储介质的数据读取效率&#xff0c;还可以提供临时的数据存储空间 spring boot中提供了缓存技术, 方便…...

JVM方法区核心技术解析:从方法区到执行引擎

方法区 方法区的内部结构 在经典方法区设计中&#xff0c;主要存储以下核心数据内容&#xff1a; 一、类型信息 方法区维护的类型信息包含以下要素&#xff1a; 类全称标识 类名称&#xff08;含完整包路径&#xff09;直接父类的完全限定名&#xff08;包含完整包路径&am…...

AIbase推出全球MCP Server集合平台 收录超12万个MCP服务器客户端

2025年&#xff0c;AI领域迎来了一项重要的技术进展——MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;的广泛应用。全球MCP Server集合平台AIbase(https://mcp.aibase.cn/)应运而生&#xff0c;为AI开发者提供了一站式的MCP服务器和客户端整合…...

Python训练打卡Day22

复习日&#xff1a; 1.标准化数据&#xff08;聚类前通常需要标准化&#xff09; scaler StandardScaler() X_scaled scaler.fit_transform(X) StandardScaler() &#xff1a;这部分代码调用了 StandardScaler 类的构造函数。在Python中&#xff0c;当你在类名后面加上括号…...

【ALINX 实战笔记】FPGA 大神 Adam Taylor 使用 ChipScope 调试 AMD Versal 设计

本篇文章来自 FPGA 大神、Ardiuvo & Hackster.IO 知名博主 Adam Taylor。在这里感谢 Adam Taylor 对 ALINX 产品的关注与使用。为了让文章更易阅读&#xff0c;我们在原文的基础上作了一些灵活的调整。原文链接已贴在文章底部&#xff0c;欢迎大家在评论区友好互动。 在上篇…...

【数据结构入门训练DAY-35】棋盘问题

本次训练聚焦于使用深度优先搜索&#xff08;DFS&#xff09;算法解决棋盘上的棋子摆放问题。题目要求在一个可能不规则的nn棋盘上摆放k个棋子&#xff0c;且任意两个棋子不能位于同一行或同一列。输入包括棋盘大小n和棋子数k&#xff0c;以及棋盘的形状&#xff08;用#表示可放…...

张 提示词优化(相似计算模式)深度学习中的损失函数优化技巧

失函数的解释 损失函数代码解析 loss = -F.log_softmax(logits[...

Elasticsearch 常用语法手册

&#x1f9f0; Elasticsearch 常用语法手册 &#x1f4da; 目录 索引操作文档操作查询操作聚合查询健康与状态查看常见问题与注意事项 &#x1f539; 索引操作 查询全部索引 GET _search创建索引 PUT /es_db创建索引并设置分片数和副本数 PUT /es_db {"settings&quo…...

华宇TAS应用中间件与亿信华辰多款软件产品完成兼容互认证

近日&#xff0c;华宇TAS应用中间件与亿信华辰多款产品成功通过兼容互认证测试&#xff0c;双方产品在功能协同、性能优化及高可用性等维度实现全面适配&#xff0c;将为用户提供更加稳定、高效、安全的国产化解决方案。 此次认证也标志着华宇在国产化生态适配领域再添重要里程…...

AI大模型从0到1记录学习numpy pandas day24

第 1 章 环境搭建 1.1 Anaconda 1.1.1 什么是Anaconda Anaconda官网地址&#xff1a;https://www.anaconda.com/ 简单来说&#xff0c;Anaconda Python 包和环境管理器&#xff08;Conda&#xff09; 常用库 集成工具。它适合那些需要快速搭建数据科学或机器学习开发环境的用…...

开源GPU架构RISC-V VCIX的深度学习潜力测试:从RTL仿真到MNIST实战

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 一、开篇&#xff1a;AI芯片架构演变的三重挑战 &#xff08;引述TPUv4采用RISC-V的行业案…...

VirtualiSurg使用SenseGlove触觉手套开发XR手术培训体验

虚拟现实和虚拟现实触觉 作为一个领先的培训平台&#xff0c;VirtualiSurg自2017年以来一直利用扩展现实(XR)和触觉技术&#xff0c;为全球医疗保健行业提供个性化的数据驱动学习解决方案。它们使医疗专业人员能够协作学习和培训&#xff0c;提高他们的技能&#xff0c;让他们…...

AbstractErrorController简介-笔记

1. AbstractErrorController简介 org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController 是 Spring Boot 提供的一个用于处理 HTTP 错误&#xff08;如 404、500 等&#xff09;的抽象类&#xff0c;用于自定义错误响应的逻辑。它是 Spring Boot…...

next.js实现项目搭建

一、创建 Next.js 项目的步骤 1、安装 npx create-next-applatest # 或 yarn create next-app # 或 pnpm create next-app 按照交互式提示配置你的项目&#xff1a; 输入项目名称 选择是否使用 TypeScript 选择是否启用 ESLint 选择是否启用 Tailwind CSS 选择是否使用 s…...

使用GoLang版MySQLDiff对比表结构

概述 下载地址&#xff1a; https://github.com/camry/mysqldiff/ 编译安装 git clone https://github.com/camry/mysqldiff.git go env -w GOPROXYhttps://goproxy.cn,direct go env -w GOPRIVATE*.corp.example.com go build .\mysqldiff.go执行对比 ./mysqldiff --sourc…...

git工具使用详细教程-------命令行和图形化工具

下载 git下载地址&#xff1a;https://git-scm.com/downloads TortoiseGit&#xff08;图形化工具&#xff09;下载地址&#xff1a;https://tortoisegit.org/download/ 认识git结构 工作区&#xff1a;存放代码的地方 暂存区&#xff1a;临时存储&#xff0c;将工作区的代码…...

失控的产品

大部分程序员很难有机会做一个新的产品&#xff0c;绝大多时候去一家新公司也都是在旧产品上修修补补。 笔者还是很幸运得到了开发新品的机会&#xff0c;从2023年开始做&#xff0c;中间经历了许多磕磕碰碰。 有的小伙伴从中离开&#xff0c;偶尔又加入1~2个人&#xff0c;但…...

区块链blog1__合作与信任

&#x1f342;我们的世界 &#x1f33f;不是孤立的&#xff0c;而是网络化的 如果是单独孤立的系统&#xff0c;无需共识&#xff0c;而我们的社会是网络结构&#xff0c;即结点间不是孤立的 &#x1f33f;网络化的原因 而目前并未发现这样的理想孤立系统&#xff0c;即现实中…...

ES常识9:如何实现同义词映射(搜索)

在 Elasticsearch&#xff08;ES&#xff09;中实现同义词映射&#xff08;如“美丽”和“漂亮”&#xff09;&#xff0c;核心是通过 同义词过滤器&#xff08;Synonym Token Filter&#xff09; 在分词阶段将同义词扩展或替换为统一词项&#xff0c;从而让搜索时输入任意一个…...

aws 实践创建policy + Role

今天Cyber 通过image 来创建EC2 的时候,要添加policy, 虽然是administrator 的role, 参考Cyber 提供的link: Imageshttps://docs.cyberark.com/pam-self-hosted/14.2/en/content/pas%20cloud/images.htm#Bring 1 Step1:...

兰亭妙微B端UI设计:融合多元风格,点亮品牌魅力

在B端产品市场&#xff0c;独特的品牌形象是企业脱颖而出的关键。兰亭妙微专注于B端UI设计&#xff0c;通过融合多元风格&#xff0c;为企业点亮品牌魅力&#xff0c;助力品牌价值提升。 兰亭妙微主创团队源自清华&#xff0c;历经多年沉淀&#xff0c;积累了丰富的设计经验。…...

高项-逻辑数据模型

逻辑数据模型的核心理解 1. 定义与特点 逻辑数据模型&#xff08;Logical Data Model, LDM&#xff09;&#xff1a; 是一种抽象的数据结构设计&#xff0c;用于描述业务实体&#xff08;如客户、订单&#xff09;及其关系&#xff08;如“客户下单”&#xff09;&#xff0c…...

Aquatone安装与使用

前言:aquatone工具获取网页截图,在资产收集的时候&#xff0c;对于网站可以起到快速浏览 michenriksen/aquatone: A Tool for Domain Flyovershttps://github.com/michenriksen/aquatone 任务一 安装chromium sudo apt install chromiumchromium -h 任务二 下载aquatone Relea…...

解读RTOS 第八篇 · 内核源码解读:以 FreeRTOS 为例

1. 引言 FreeRTOS 作为最流行的嵌入式实时操作系统之一,其内核源码简洁且功能完善。通过剖析其关键模块(任务管理、调度器、队列、内存管理和移植层),不仅能够更深入地理解 RTOS 的运行机制,还能掌握根据项目需求进行内核定制与优化的能力。本章将带你以 FreeRTOS 10.x 版…...

6、登录功能后端开发

6、登录功能后端开发 https://xiaoxueblog.com/ai/%E7%99%BB%E5%BD%95%E5%8A%9F%E8%83%BD%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91.html 1、新建用户表SQL脚本 -- CREATE DATABASE aicloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;-- 创建用户表 drop table if exi…...

「彻底卸载 Quay 容器仓库」:干净移除服务、镜像与配置的全流程指南

文章目录 &#x1f9f9; 第一步&#xff1a;停止并禁用 systemd 服务&#x1f6ae; 第二步&#xff1a;移除 Podman 容器与相关资源1. 删除 quay-app 容器2. 删除镜像&#xff08;如果你想彻底清理&#xff09;3. 删除挂载卷&#xff08;比如 SQLite 存储&#xff09; &#x1…...

C++从入门到实战(十五)String(上)介绍STL与String的关系,为什么有string类,String有什么用

C从入门到实战&#xff08;十五&#xff09;String&#xff08;上&#xff09; 前言一、STL与String的关系1. STL 是什么&#xff1f;2. String 是什么&#xff1f;3. String 与 STL 的关系 二、为什么有string类&#xff0c;有什么用1. 为什么需要 string 类&#xff1f;2. st…...

【Python 正则表达式】

Python 正则表达式通过 re 模块实现模式匹配&#xff0c;是文本处理的核心工具。以下是系统化指南&#xff0c;包含语法详解和实战案例&#xff1a; 一、正则基础语法 1. 元字符速查表 符号含义示例匹配结果.任意字符&#xff08;除换行符&#xff09;r"a.c"“abc”…...

【MySQL】第四弹——表的CRUD进阶(二)数据库设计

文章目录 &#x1f31f;范式&#x1f31f;表的设计&#x1f4ab;第一范式 1NF&#x1fa90;反例&#x1fa90;正例 &#x1f4ab;第二范式 2NF&#x1fa90;反例&#x1fa90;正例 &#x1f4ab;第三范式 3NF&#x1fa90;反例&#x1fa90;正例 &#x1f4ab;表的设计方法&…...

Unity基础学习(十五)核心系统——音效系统

目录 一、关于音频文件的导入相关 二、音频源组件Audio Source 三、Audio Listener的介绍 四、关于播放音乐的方式 五、麦克风输入相关 Microphone 类方法与属性总览​ 1. Start 方法​ ​2. End 方法​ ​3. IsRecording 方法​ ​4. GetPosition 方法​ ​5. devic…...

计算机视觉----常见卷积汇总

普通卷积   普通卷积大家应该都比较熟悉了&#xff0c;如果不熟悉的话&#xff0c;可以参考我之前的博客&#xff0c;或者去网上自行百度。这里主要想补充两个知识点。一&#xff1a;卷积核参数量怎么算&#xff1f; 二&#xff1a;如何高效的并行运算卷积滑窗&#xff1f; …...

【人工智能-agent】--Dify+Mysql+Echarts搭建了一个能“听懂”人话的数据可视化助手!

Echarts官网&#xff1a;https://echarts.apache.org/zh/index.html ECharts 是一个由百度团队开发的、基于 JavaScript 的开源可视化图表库&#xff0c;它提供了丰富的图表类型和强大的交互功能&#xff0c;能够帮助开发者轻松创建专业级的数据可视化应用。 核心特点 丰富的图…...

【专栏启动】开篇:为什么是 Django + Vue3?测试平台的技术选型与架构蓝图

【专栏启动】开篇&#xff1a;为什么是 Django Vue3&#xff1f;测试平台的技术选型与架构蓝图 前言一、为什么是 Django Vue3&#xff1f;二、测试平台的架构设计蓝图三、测试平台模块功能概述 结语 前言 一个高效、稳定、易用的测试平台&#xff0c;不仅能够帮助团队提升测…...

Rust 学习笔记:关于 Vector 的练习题

Rust 学习笔记&#xff1a;关于 Vector 的练习题 Rust 学习笔记&#xff1a;关于 Vector 的练习题哪个调用会报错&#xff1f;以下代码能否通过编译&#xff1f;若能&#xff0c;输出是&#xff1f;以下代码能否通过编译&#xff1f;若能&#xff0c;输出是&#xff1f;以下代码…...