第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從 Python 調用 Rust 異步方法?

如何從 Python 調用 Rust 異步方法?

幕布斯7119047 2023-02-07 13:39:37
我想在 Python 中使用 Rust 異步方法。我正在嘗試使用PyO3或rust-cpython。例如,對于同步 Rust 函數(shù),我可以使用,#[pyfunction]fn myfunc(a: String) -> PyResult<String> {   let mut contents = String::new();   contents = a.to_string() + " appended";   Ok((contents))}#[pymodule]fn MyModule(py: Python, m: &PyModule) -> PyResult<()> {    m.add_wrapped(wrap_pyfunction!(urlshot))?;    Ok(())}對于異步方法,我該怎么做?例如,我想在 Python 中調用以下方法,async fn hello_world() {    println!("hello, world!");}
查看完整描述

2 回答

?
搖曳的薔薇

TA貢獻1793條經驗 獲得超6個贊

由于沒有解決此問題的簡單方法(至少,我還沒有找到),我將我的異步方法轉換為同步方法。并在 Python 方面將其稱為,


async fn my_method(s: &str) -> Result<String, Error> {

    // do something

}


#[pyfunction]

fn my_sync_method(s: String) -> PyResult<String> {

    let mut rt = tokio::runtime::Runtime::new().unwrap();

    let mut contents = String::new();

    rt.block_on(async {

        result = format!("{}", my_sync_method(&s).await.unwrap()).to_string();

    });

   Ok((result))

}


#[pymodule]

fn MyModule(py: Python, m: &PyModule) -> PyResult<()> {

    m.add_wrapped(wrap_pyfunction!(my_sync_method))?;

    Ok(())

}

已編輯

在Cargo.toml文件中,我添加了以下依賴項,



[dependencies.pyo3]

git = "https://github.com/PyO3/pyo3"

features = ["extension-module"]

運行后cargo build --release生成target/release/libMyModule.so二進制文件。將其重命名為MyModule.so,現(xiàn)在可以從 Python 導入它。


import MyModule

result = MyModule.my_sync_method("hello")

使用setuptools-rust,我可以將它捆綁為一個普通的 Python 包。


以上所有代碼和命令都在新發(fā)布的 Linux Mint 20 上進行了測試。在 MacOS 上,二進制文件將為libMyModule.dylib.


查看完整回答
反對 回復 2023-02-07
?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

如果你想使用 Python 來控制 Rust 的異步功能,我認為它不會起作用(或者至少它非常復雜,因為你需要連接兩種不同的future機制)。對于異步函數(shù),Rust 編譯器將維護一個狀態(tài)機來管理在 await 的控制下正確運行的協(xié)程。這是 Rust 應用程序的內部狀態(tài),Python 無法觸及它。同樣,Python 解釋器也有 Rust 無法觸及的狀態(tài)機。

我確實找到了有關如何使用 FFI 導出異步函數(shù)的主題。主要思想是將異步包裝在 a 中BoxFuture,讓 C 控制將其返回給 Rust 的時間。但是,您不能BoxFuture在 PyO3 中使用,因為它的pyfunction宏不能將函數(shù)返回轉換BoxFuture為 Python 回調。您可以嘗試使用 FFI 創(chuàng)建一個庫并使用 python 的 cffi 模塊來加載它。


查看完整回答
反對 回復 2023-02-07
  • 2 回答
  • 0 關注
  • 229 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號