nacos-sdk-rust binding for Python

news2024/10/7 17:35:24

广告时间

nacos-sdk-rust-binding-py : nacos-sdk-rust binding for Python with PyO3.

Tip: nacos-sdk-python 仓库暂未提供 2.x gRPC 交互模式,为了能升级它,故而通过 ffi 方式调用 nacos-sdk-rust

py 包 -> https://pypi.org/project/nacos-sdk-rust-binding-py

客官,走过路过不要错过,买不买瞧一瞧也是好的。行过路过唔好错过啦👆~

缘起?冲突!

啊哈?哪有那么多理由!就是闲来无事,想试试 binding for Python …

的确不像 nacos-sdk-rust-binding-node 有实际的需求,但也偶尔在 Nacos 社区用户群里看到有人问 nacos-sdk-python 是否支持 gRPC ;虽也想提供些帮助,之前也了解有 PyO3 神器,但确实不懂 Python 这门语言。

这不是巧了吗这不是

也是偶然,近来转岗到新部门,恰逢上手新工作有个文档记录了黑屏操作的 py 脚本 😂 ;而我作为负责人刚好又要提供它给内部用户,若我不理解脚本干了啥那说不过去;唯有尝试看了看,emmmm 语法确实不难,简单易理解。

前些天阅览了这篇文章 「为 Databend Rust Driver 实现 Python Binding」,我可记着它,会有一日能实现 nacos-sdk-rust binding for Python

周末~闲来无事!开搞~

How? PyO3 + Maturin

Rust 和 Python 都拥有丰富的包和库。在 Python 中,很多包的底层是使用 C/C++ 编写的,而 Rust 天生与 C 兼容。因此,我们可以使用 Rust 为 Python 编写软件包,实现 Python 调用 Rust 的功能,从而获得更好的性能和速度。

为了实现这一目标,PyO3 应运而生。PyO3 不仅提供了 Rust 与 Python 的绑定功能,还提供了一个名为 maturin 的开箱即用的脚手架工具。通过 maturin,我们可以方便地创建基于 Rust 开发的 Python 扩展模块。这样一来,我们可以重新组织代码,使用 Rust 编写性能更好的部分,而其余部分仍然可以使用原始的 Python 代码。

– 摘自「为 Databend Rust Driver 实现 Python Binding」

除了「Databend Rust Driver」还借鉴 PyO3 examples wasmer-python 等些项目,以及「Python3 教程 | 菜鸟教程 」

由 maturin 初始化项目,仅需十来个提交完成基本可用的功能
nacos-sdk-rust-binding-py-commit

难点

  1. python 默认非 aysnc ?
    a. maturin 构建提示 Rust 的绑定代码不能写 async 方法!
    b. 若 async ,py 应该是要借助 asyncio 库来支持,没深入理解也暂时让使用成本低,故而启用了非 async 的 nacos-sdk-rust 。
  2. python 函数被 Rust 调用
    a. Nacos 配置监听、服务订阅,这些 callback 函数需要由 py 用户实现逻辑作为参数传入。

第二点在 wasmer-python/packages/api/src/externals/function.rs 找到了借鉴,所以 Nacos Config Listener 绑定方法实现如下

#[pyo3(signature = (data_id, group, listener))]
pub fn add_listener(
    &self,
    py: Python,
    data_id: String,
    group: String,
    listener: &PyAny, // PyFunction arg: <NacosConfigResponse>
) -> PyResult<()> {
    if !listener.is_callable() {
        return Err(PyErr::new::<PyValueError, _>(
            "Arg `listener` must be a callable",
        ));
    }
    self.inner
        .add_listener(
            data_id,
            group,
            Arc::new(NacosConfigChangeListener {
                func: Arc::new(listener.to_object(py)),
            }),
        )
        .map_err(|nacos_err| PyRuntimeError::new_err(format!("{:?}", &nacos_err)))?;
    Ok(())
}

pub struct NacosConfigChangeListener {
    func: Arc<PyObject>,
}

impl nacos_sdk::api::config::ConfigChangeListener for NacosConfigChangeListener {
    fn notify(&self, config_resp: nacos_sdk::api::config::ConfigResponse) {
        let ffi_conf_resp = transfer_conf_resp(config_resp);

        // call PyFunction with args
        let _ = Python::with_gil(|py| -> PyResult<()> {
            let _ = self.func.call(py, (ffi_conf_resp,), None);
            Ok(())
        });
    }
}

总结

虽小编不是 python 真实用户,但闲来无事嘛,做点什么小贡献,亲身体验了「Rust could binding for Anythings!!!~」

  • https://github.com/napi-rs/napi-rs binding for NodeJs
  • https://github.com/PyO3/pyo3 binding for Python
  • https://github.com/dtolnay/cxx binding for C++
  • https://github.com/jni-rs/jni-rs binding for Java

附阅:「nacos-sdk-rust binding for NodeJs」、「Rust 从入门到放弃,再入门到贡献 nacos-sdk-rust」

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/635170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java代码的运行过程】 ——每天一点小知识

&#x1f4a7; J a v a 代码的运行过程 \color{#FF1493}{Java代码的运行过程} Java代码的运行过程&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专栏…

Vue中如何处理日期与时间

Vue中如何处理日期与时间 日期和时间处理是Web应用中常见的需求&#xff0c;Vue作为一款流行的前端框架&#xff0c;提供了很多方便的工具和库&#xff0c;以满足不同业务场景下的需求。本文将介绍如何在Vue中处理日期和时间&#xff0c;包括使用原生JavaScript、Moment.js和D…

useMemo和useCallback

上述代码中&#xff0c;useSate 用于定义了三个状态&#xff1a;supNum、oppNum、x。在组件函数中&#xff0c;我们根据这些状态来计算投票的支持率&#xff0c;并将其渲染到视图中。但是&#xff0c;每次状态变化时&#xff0c;投票支持率的计算都会重新执行&#xff0c;即使其…

c++深搜1-迷宫类问题

目录 1.问题引入 2.知识讲解 3.例题解析 【例题1】迷宫的第一条出路。 题目描述 输入格式 输出格式 样例 输入数据#1 输出数据#1 输入数据#2 输出数据#2 【例题2】迷宫的所有路径。 【例题3】走出迷宫的最少步数。 1.问题引入 拓拓小时候玩迷宫游戏时&#xff…

小酷智慧地图3D导公众号小程序 v1.0.50+前端

&#x1f388; 限时活动领体验会员&#xff1a;可下载程序网创项目短视频素材 &#x1f388; &#x1f389; 有需要的朋友记得关赞评&#xff0c;阅读文章底部来交流&#xff01;&#xff01;&#xff01; &#x1f389; ✨ 源码介绍 小酷智慧地图3D导览系统适用于城市或乡镇全…

性能测试之全链路压测实战理论详解

目录 前言 01为什么需要全链路压测&#xff1f; 02全链路压测解决了哪些问题&#xff1f; 03哪些业务场景适合做 04基础技术组件 05小结 前言 要说当下研发领域最热门的几个词&#xff0c;全链路压测 肯定跑不了。最近的几次大会上&#xff0c;也有不少关于全链路的议题。…

Vue项目中使用MapboxGL开发3D地图教程(一)MapboxGL介绍以及前期vue项目的搭建

MapboxGL介绍以及前期vue项目的搭建 1、Mapbox-gl简介2、搭建vue项目2.1、创建vue项目2.2、注册mapbox官网2.3、mapbox-gl入门案例 3、Mapbox-gl地图主要配置参数说明 1、Mapbox-gl简介 Mapbox-gl是一个开源、基于webgl技术的前端地图类库。 地图数据渲染和可视化这块我们经常用…

第七章 详细设计

结构化程序设计的基本结构包括 顺序结构、选择结构、循环结构 三种。 详细设计层 详细设计概览 详细设计的任务&#xff1a;定义每一模块 三种控制结构&#xff1a;顺序、选择、循环 伪码 伪码是一种混合语言。外 部采用形式语言定义控制 结构和数据结构&#xff0c;内部使…

OpenGL光照之投光物

文章目录 平行光点光源衰减实现衰减 聚光手电筒平滑/软化边缘完整代码 我们目前使用的光照都来自于空间中的一个点。它能给我们不错的效果&#xff0c;但现实世界中&#xff0c;我们有很多种类的光照&#xff0c;每种的表现都不同。将光投射(Cast)到物体的光源叫做投光物(Light…

算法提高-图论- 最小生成树的扩展应用

最小生成树的扩展应用 最小生成树的扩展应用AcWing 1146. 新的开始AcWing 1145. 北极通讯网络AcWing 346. 走廊泼水节AcWing 1148. 秘密的牛奶运输 最小生成树的扩展应用 AcWing 1146. 新的开始 利用虚拟源点建图和原题的题意是等价的&#xff0c;因此我们使用虚拟源点建图套…

主从架构lua脚本-Redis(四)

上篇文章介绍了rdb、aof持久化。 持久化RDB/AOF-Redis&#xff08;三&#xff09;https://blog.csdn.net/ke1ying/article/details/131148269 redis数据备份策略 写job每小时copy一份到其他目录。目录里可以保留最近一个月数据。把目录日志保存到其他服务器&#xff0c;防止机…

服务器网站搭建(一)

文章目录 环境搭建域名购买和解析创建网站环境搭建 一台服务器,我买的腾讯云新加坡的。根据需求选择配置。 重置密码: 自己设置的密码要记住: 登录: 安装宝塔(centos系统),参考官网: https://www.bt

Python 接口测试框架

目录结构定义 首先来看一下项目整体的结构 框架结构 代码结构 Excel 文件结构 代码详细解析 1.工具包 tools 封装操作 excel 方法 excel_operation.py import xlrd from config.config import PROJECT_PATHclass OperationExcel:def __init__(self, file_nameNone, sheet_…

县村快递物流小程序 v1.2.63+前端(本站修复版)

&#x1f388; 限时活动领体验会员&#xff1a;可下载程序网创项目短视频素材 &#x1f388; &#x1f389; 有需要的朋友记得关赞评&#xff0c;文章底部来交流&#xff01;&#xff01;&#xff01; &#x1f389; ✨ 源码介绍 核心功能&#xff1a; 1、县分拣中心入库出库 2…

什么是Vue的脚手架(Vue CLI)?

什么是Vue的脚手架&#xff08;Vue CLI&#xff09;&#xff1f; Vue.js 是一款流行的 JavaScript 框架&#xff0c;用来构建现代的单页面应用程序&#xff08;SPA&#xff09;。Vue.js 的核心库提供了丰富的功能和 API&#xff0c;但是创建一个完整的应用程序需要更多的工具和…

浏览器插件 | Font Picker - 网页字体识别工具

目录 软件简介 Font Picker插件背景 Font Picker插件离线安装教程 Font Picker 小结 软件简介 Font Picker 插件是一款用于 Chrome 浏览器的字体选择器&#xff0c;这种网页字体识别工具看起来非常的干净&#xff0c;使用起来也十分的简单。本文提供Font Picker网页字体…

d3dcompiler_43.dll文件丢失怎么修复,最新修复方法分享

本教程操作系统&#xff1a;Windows系统、 d3dcompiler_43.dll是电脑文件中的dll文件&#xff08;动态链接库文件&#xff09;。如果计算机中丢失了某个dll文件&#xff0c;可能会导致某些软件和游戏等程序无法正常启动运行&#xff0c;并且导致电脑系统弹窗报错。 在我们打开…

【LeetCode】110. 平衡二叉树

110. 平衡二叉树&#xff08;简单&#xff09; 思路 对二叉树做先序遍历&#xff0c;从底至顶返回子树最大高度&#xff0c;若判定某子树不是平衡树则“剪枝”直接向上返回。 递归返回值&#xff1a; 当节点 root 左、右子树的高度差 > 1&#xff1a;返回 -1&#xff0c;代…

吴恩达471机器学习入门课程1第1周

文章目录 1加载数据集2计算COST(均值平方差&#xff0c;1/2m(y_pre - y))3计算梯度4画出成本曲线5梯度下降 import math, copy import numpy as np import matplotlib.pyplot as plt plt.style.use(./deeplearning.mplstyle) from lab_utils_uni import plt_house_x, plt_conto…

OpenMMLab-AI实战营第二期——4-2.MMDetection代码课

文章目录 1. MMDetection介绍&#xff08;vs MMSegmentation&#xff0c;mmdetection3d&#xff09;2. 代码2.1 使用pycocotools配合exif可视化图像2.2 mmdetection中config的继承2.3 mmdet的数据集可视化问题&#xff08;VISUALIZERS&#xff09;2.4 pin_memory参数设置2.5 ma…