Robyn高性能Web框架系列08:使用 Rust 扩展 Robyn

使用 Rust 扩展 Robyn

    • PyO3 Bridge
    • 示例:一个简单的Rust扩展
      • 1、安装必须的组件
      • 2、初始化Rust项目
      • 3、编写Rust代码
      • 4、在Robyn中使用Rust代码


在“Robyn高性能Web框架系列07:多进程、性能调优”一节中,我们讲解了Robyn丰富的性能调优方式,其中也详细说明了其独特的“Python-Rust 混合架构”即Python层负责业务逻辑,Rust层负责性能调优,Python层与Rust层通过PyO3有机结合,这样既可以获得Python易开发性与 Rust 的高性能。本节将通过一个小示例来讲解如何使用 Rust 扩展 Robyn。

PyO3 Bridge

在Robyn提供了一些Rust扩展机制,如--create-rust-file命令与--compile-rust-path命令,然而这些命令不是很好用。既然Robyn是基于PyO3实现的“Python-Rust 混合架构”,那么我们就直接通过PyO3来完成使用 Rust 对Robyn的扩展。

PyO3 是一个用于将 PythonRust 集成的库,支持Python与Rust的双向互调用:

  1. 在 Rust 中编写 Python 模块(作为扩展模块),供 Python 调用。
  2. 在 Rust 中嵌入 Python 解释器,让 Rust 调用 Python 代码。
    当然,PyO3本身就是一个复杂、完善的工具,本节并不打算深入讲解PyO3,有兴趣的小伙伴可以关注GeekABC后续的文章。

示例:一个简单的Rust扩展

计算机图形学(Computer Graphics) 中,三角形面积计算有非常广泛的用途,因此提高三角形面积计算的性能有很大的意义。在本示例中,我们将使用Robyn的Python层来接收用户输入的“高”和“底边”的长度,使用Rust 层来完成面积计算,返回给Python层,最后返回给用户。

1、安装必须的组件

Rust 开发环境

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

安装后运行:

rustc --version
cargo --version

确保 Rust 和 Cargo 已可用。

Python 环境
需要安装与目标编译版本匹配的 Python 解释器

  • 推荐使用 pyenv 或虚拟环境(venv, conda);
  • python3-dev / python3.X-dev(Linux)版本必须存在;
  • 可支持多个 Python 版本(构建时指定)。

maturin——构建与发布工具
maturin它是一个用于以最低配置构建和发布基于 Rust 的 Python 包的工具。

pip install maturin

最好进行验证:

maturin --version

在不同的环境中安装上述组件时可能会有具体问题,请根据实际情况进行调整。

2、初始化Rust项目

Rust项目可以作为一个独立项目,也可以直接放在Robyn项目的特定位置,如src/components下。使用maturin init命令初始化项目:

cd src/components/triangle_area
maturin init
✔ 🤷 What kind of bindings to use? · pyo3✨ Done! New project created triangle_area

这时会产生一个类似的项目结构:

src
├── app.py
├── components├── triangle_area├── src├── lib.rs├── Cargo.toml├── pyproject.toml

3、编写Rust代码

Cargo.toml

[package]  
name = "triangle_area"  
version = "0.1.0"  
edition = "2021"  # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html  
[lib]  
name = "triangle_area"  
crate-type = ["cdylib"]  [dependencies]  
pyo3 = "0.25.0"

必须保持packagelib的name一致。

src/lib.rs

use pyo3::prelude::*;  /// Formats the sum of two numbers as string.  
#[pyfunction]  
fn area_by_base_height(base: f64, height: f64) -> PyResult<f64> {  Ok(0.5 * base * height)  
}  /// A Python module implemented in Rust.  
#[pymodule]  
fn triangle_area(m: &Bound<'_, PyModule>) -> PyResult<()> {  m.add_function(wrap_pyfunction!(area_by_base_height, m)?)?;  Ok(())  
}

必须保持pymodule的name与Cargo.toml中的packagelib的name一致。

4、在Robyn中使用Rust代码

完成代码编写后,运行maturin develop命令,这将构建软件包并将其安装到之前创建并激活的 Python 虚拟环境中。这时我们就可以在Robyn项目中使用import triangle_area引入该库了。

from robyn import Robyn, Request  
from robyn.types import PathParams  import triangle_area  app = Robyn(__file__)  @app.get("/calc_triangle_area/:base/:height")  
def calc_triangle_area(request: Request,path_params: PathParams):  try:  r = triangle_area.area_by_base_height(  base=float(path_params.get("base",0.0)),  height=float(path_params.get("height",0.0))  )  except:  return {"message": "Invalid input for base or height"}  return {"message": r}

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

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

相关文章

利用Pandas进行条件替换与向前填充

目录一、需求二、实现代码案例代码详细解释1. 导入库和创建数据2. 条件替换与填充a. 条件掩码 - mask()b. 向前填充 - ffill()c. 类型转换 - astype(int)3. 打印结果三、实际应用场景四、可能的变体五、总结一、需求 示例数据&#xff1a; 项 目 0 1 0 1 0 1 2 0 2 3 …

springboot数据脱敏(接口级别)

文章目录自定义脱敏注解脱敏注解接口脱敏注解反射AOP实现字段脱敏切面定义脱敏策略脱敏策略的接口电话号码脱敏策略邮箱脱敏不脱敏姓名脱敏身份证号脱敏JacksonAOP实现脱敏定义序列化序列化实现脱敏切面定义JacksonThreadLocal拦截器实现脱敏定义ThreadLocal自定义序列化序列化…

Spring核心原理的快速入门:快速了解IoC与DI

IoC IoC&#xff1a;Inversion of Control(控制反转) Spring是一个包含了众多工具的IoC容器(即bean&#xff1a;spring管理的对象),也就是说Spring 是一个“控制反转”的容器。 之前是对象本身管理自己的生命周期等等&#xff0c;现在交给spring来管理对象的生命周期 IoC介绍 …

ffmpeg 中config 文件一些理解

依赖检查 config中看到最多的是&#xff1a; ... nvenc_deps"ffnvcodec" nvenc_deps_any"libdl LoadLibrary" nvenc_encoder_deps"nvenc" ... h264_crystalhd_decoder_select"crystalhd h264_mp4toannexb_bsf h264_parser" h264_cuvid…

Digital Rainwater Collection System (v1.0)

The law doesn’t punish the masses. If only one guy runs his own rainwater system, he gets fined for “illegal mining.” But if millions of households self-host their “digital wells,” the whole centralized model collapses. Cloud providers and regulators …

NFS文件存储及部署论坛(小白的“升级打怪”成长之路)

目录 一、概述 NFS挂载原理 NFS工作原理 RPC与NFS通讯过程 二、NFS服务安装与启停 NFS服务安装 NFS服务启停 三、NFS服务配置文件 四、NFS文件共享配置文件 配置参数说明 五、命令解析 六、客户端访问 七、客户端挂载 实战案例 部署NFS文件存储及discuz论坛应用 …

JavaScript 对象创建:new 操作符全解析

引言 在 JavaScript 中&#xff0c;new 操作符是实现面向对象编程的​​核心机制​​之一。本文将从原理层面对 new 操作符进行深度剖析&#xff0c;探讨其工作机制、内部实现和实际应用场景。无论您是 JavaScript 初学者还是资深开发者&#xff0c;都能从本文获得以下知识和技…

Spring Boot + Vue.js 全栈开发:从前后端分离到高效部署,打造你的MVP利器!

文章目录一、为何选择 Spring Boot Vue.js&#xff1f;全栈开发的“黄金搭档”&#xff01;二、项目初始化与基础架构搭建2.1 后端&#xff1a;初始化 Spring Boot 项目2.2 前端&#xff1a;初始化 Vue.js 项目2.3 核心配置&#xff1a;打通前后端通信与跨域&#xff01;后端 …

容器技术技术入门与Docker环境部署

目录 一&#xff1a;Docker 概述 1&#xff1a;什么是Docker 2:Docker 的优势 3&#xff1a;Docker的应用场景 4&#xff1a;Docker核心概念 二&#xff1a;Docker 安装 三&#xff1a;Docker 镜像操作 1&#xff1a;获取镜像 2&#xff1a;查看镜像信息 3&#xff1a…

构建高效分布式系统:bRPC组合Channels与HTTP/H2访问指南

构建高效分布式系统&#xff1a;bRPC组合Channels与HTTP/H2访问指南 引言 在现代分布式系统中&#xff0c;下游服务访问的复杂性日益增加。bRPC通过组合Channels和HTTP/H2访问优化&#xff0c;提供了解决多层级RPC调用、负载均衡和协议兼容性问题的完整方案。本文将深入解析两大…

WSL创建Ubuntu子系统与 VS code 开发

文章目录一、打开Windows的虚拟化基础功能二、安装WSL和Ubuntu1. 安装 WSL2. 安装 Ubuntu三、 VScode一、打开Windows的虚拟化基础功能 控制面板-程序和功能-启动或关闭Windows功能&#xff0c;勾选适用于Linux的Windows子系统、虚拟机平台&#xff0c; 完成后根据提示重启电脑…

AlpineLinux二进制文件部署prometheus

在Alpine Linux上通过二进制文件部署Prometheus的步骤如下: 创建用户和组: groupadd prometheus useradd -g prometheus -m -s /sbin/nologin prometheus下载Prometheus二进制文件: 你可以从Prometheus的官方GitHub发布页面下载最新的二进制文件。例如,使用wget命令: wget…

IoT 小程序:如何破解设备互联的碎片化困局?

一、IoT 设备管理为何需要轻量化解决方案&#xff1f;随着物联网设备规模爆发式增长 —— 预计 2025 年全球连接数将达 270 亿台&#xff0c;传统 Native 应用开发模式的弊端日益凸显&#xff1a;某智能家居厂商开发 3 款主流设备 APP&#xff0c;需维护 iOS/Android/ 小程序 3…

Word 怎么让字变大、变粗、换颜色?

这是Word中最常用也最基础的操作之一。学会它&#xff0c;你的文档就会立刻变得重点突出&#xff0c;清晰易读。 记住一个核心前提&#xff1a;无论做什么格式修改&#xff0c;第一步永远是【先选中你要修改的文字】。 你可以把鼠标放在文字的开头&#xff0c;按住左键&#xf…

Ruby 安装 - Linux

Ruby 安装 - Linux 引言 Ruby 是一种广泛使用的高级编程语言,以其简洁、优雅和强大的功能而闻名。在 Linux 系统上安装 Ruby 是许多开发者的首要任务。本文将详细介绍如何在 Linux 系统上安装 Ruby,包括准备工作、安装过程和常见问题解决。 准备工作 在开始安装 Ruby 之前…

数组的应用示例

任意输入【0,9】范围内的整数&#xff0c;统计输入的每一种数字的个数并输出&#xff0c;输入-1结束程序 #include <stdio.h> int main(){const int number 10;int x;int i;int count[number];for ( i 0; i < number; i){count[i] 0;}printf("请输入0&#xf…

鸿蒙智行6月交付新车52747辆 单日交付量3651辆

近日&#xff0c;鸿蒙智行公布最新销量数据&#xff0c;6月单月全系交付52747辆&#xff0c;单日交付量3651辆&#xff0c;分别刷新鸿蒙智行单月、单日销量历史新高。仅用39个月实现全系累计交付80万辆&#xff0c;创下新势力汽车最快交付纪录。 尊界S800自5月30日上市以来&…

基于模糊控制及BP神经网络开关磁阻电机的matlab仿真

1.模型简介本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2015Rb&#xff09;软件。2.仿真算法:1&#xff09;采用转速、转矩双闭环控制算法&#xff1b;2&#xff09;外环是速度环&#xff0c;采用改进复合模糊控制&#xff0c;实现速度跟踪&#xff1b;3&#xff09;…

最新团购源码商城 虚拟商城系统源码 全开源

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 最新团购源码商城 虚拟商城系统源码 全开源 基于PHP开发的多功能在线商城系统&#xff0c;适合个人、小型企业或创业团队快速搭建自己的商品销售平台。系统界面美观&#xff0c;功能丰富…

Visual Studio 旧版软件下载教程

一、前言最近在开发过程中编译使用Cuda的版本较低&#xff0c;导致与最新的Visual Studio Community 2022 17.14.8不兼容。编译报错如下&#xff1a;[cmake] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include\yvals_core.h(902): e…