Function into_future

Source
pub fn into_future(
    awaitable: Bound<'_, PyAny>,
) -> PyResult<impl Future<Output = PyResult<PyObject>> + Send>
Expand description

Convert a Python awaitable into a Rust Future

This function converts the awaitable into a Python Task using run_coroutine_threadsafe. A completion handler sends the result of this Task through a futures::channel::oneshot::Sender<PyResult<PyObject>> and the future returned by this function simply awaits the result through the futures::channel::oneshot::Receiver<PyResult<PyObject>>.

§Arguments

  • awaitable - The Python awaitable to be converted

§Examples

use std::time::Duration;
use std::ffi::CString;

use pyo3::prelude::*;

const PYTHON_CODE: &'static str = r#"
import asyncio

async def py_sleep(duration):
    await asyncio.sleep(duration)
"#;

async fn py_sleep(seconds: f32) -> PyResult<()> {
    let test_mod = Python::with_gil(|py| -> PyResult<PyObject> {
        Ok(
            PyModule::from_code(
                py,
                &CString::new(PYTHON_CODE).unwrap(),
                &CString::new("test_into_future/test_mod.py").unwrap(),
                &CString::new("test_mod").unwrap()
            )?
            .into()
        )
    })?;

    Python::with_gil(|py| {
        pyo3_async_runtimes::async_std::into_future(
            test_mod
                .call_method1(py, "py_sleep", (seconds.into_pyobject(py).unwrap(),))?
                .into_bound(py),
        )
    })?
    .await?;
    Ok(())
}