我想在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!");
}
如果您想使用Python控制Rust的异步函数,我认为它不会起作用(或者至少它非常复杂,因为您需要连接两种不同的future
机制)。对于异步函数,Rust编译器将维护状态机,以管理在等待的控制下正确运行的协程。这是Rust应用程序的内部状态,Python无法触摸它。同样,Python解释器也具有Rust不能触摸的状态机。
我确实找到了有关如何使用FFI导出异步功能的主题。主要思想是将异步包装在a中,BoxFuture
并让C控制将其返回到Rust的时间。但是,您不能BoxFuture
在PyO3中使用它,因为其pyfunction
宏无法将函数返回BoxFuture
转换为Python回调。您可以尝试使用FFI创建一个库,并使用python的cffi模块加载它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句