为了账号安全,请及时绑定邮箱和手机立即绑定

如何从 Python 调用 Rust 异步方法?

如何从 Python 调用 Rust 异步方法?

幕布斯7119047 2023-02-07 13:39:37
我想在 Python 中使用 Rust 异步方法。我正在尝试使用PyO3或rust-cpython。例如,对于同步 Rust 函数,我可以使用,#[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,现在可以从 Python 导入它。


import MyModule

result = MyModule.my_sync_method("hello")

使用setuptools-rust,我可以将它捆绑为一个普通的 Python 包。


以上所有代码和命令都在新发布的 Linux Mint 20 上进行了测试。在 MacOS 上,二进制文件将为libMyModule.dylib.


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

TA贡献1796条经验 获得超10个赞

如果你想使用 Python 来控制 Rust 的异步功能,我认为它不会起作用(或者至少它非常复杂,因为你需要连接两种不同的future机制)。对于异步函数,Rust 编译器将维护一个状态机来管理在 await 的控制下正确运行的协程。这是 Rust 应用程序的内部状态,Python 无法触及它。同样,Python 解释器也有 Rust 无法触及的状态机。

我确实找到了有关如何使用 FFI 导出异步函数的主题。主要思想是将异步包装在 a 中BoxFuture,让 C 控制将其返回给 Rust 的时间。但是,您不能BoxFuture在 PyO3 中使用,因为它的pyfunction宏不能将函数返回转换BoxFuture为 Python 回调。您可以尝试使用 FFI 创建一个库并使用 python 的 cffi 模块来加载它。


查看完整回答
反对 回复 2023-02-07
  • 2 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信