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

沉罩:

我想在Python中使用Rust异步方法。我正在尝试使用PyO3rust-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!");
}
whilrun:

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章