Function pyo3_asyncio::async_std::local_future_into_py_with_loop[][src]

pub fn local_future_into_py_with_loop<F>(
    event_loop: &PyAny,
    fut: F
) -> PyResult<&PyAny> where
    F: Future<Output = PyResult<PyObject>> + 'static, 
Expand description

Convert a !Send Rust Future into a Python awaitable

Arguments

  • event_loop - The Python event loop that the awaitable should be attached to
  • fut - The Rust future to be converted

Examples

use std::{rc::Rc, time::Duration};

use pyo3::prelude::*;

/// Awaitable non-send sleep function
#[pyfunction]
fn sleep_for(py: Python, secs: u64) -> PyResult<&PyAny> {
    // Rc is non-send so it cannot be passed into pyo3_asyncio::async_std::future_into_py
    let secs = Rc::new(secs);
    Ok(pyo3_asyncio::async_std::local_future_into_py_with_loop(
        pyo3_asyncio::async_std::get_current_loop(py)?,
        async move {
            async_std::task::sleep(Duration::from_secs(*secs)).await;
            Python::with_gil(|py| Ok(py.None()))
        }
    )?.into())
}

#[pyo3_asyncio::async_std::main]
async fn main() -> PyResult<()> {
    Python::with_gil(|py| {
        let py_future = sleep_for(py, 1)?;
        pyo3_asyncio::async_std::into_future(py_future)
    })?
    .await?;

    Ok(())
}