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
英文地址,請注明出處:http://en.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…