Rust-PyO3创建死锁/从python调用异步函数后变得无响应

Rust-PyO3创建死锁/从python调用异步函数后变得无响应,python,asynchronous,rust,rust-tokio,pyo3,Python,Asynchronous,Rust,Rust Tokio,Pyo3,上面是我在项目中使用的python和rust文件。我试图将一个异步函数作为参数传递给我的rust库,然后使用tokio运行时调用它。 当我执行python文件时,会出现死锁,因为即使是^C也没有退出它 请让我知道如何正确地等待rust中的python函数 提前感谢。发生死锁是因为您正在通过rt.block\u on()阻塞主线程,从而阻止Python事件循环运行要返回block\u on()调用所需的协程。这种循环依赖会导致死锁。您可以将block_on()更改为spawn(),以防止死锁,但我

上面是我在项目中使用的python和rust文件。我试图将一个异步函数作为参数传递给我的rust库,然后使用tokio运行时调用它。 当我执行python文件时,会出现死锁,因为即使是
^C
也没有退出它

请让我知道如何正确地等待rust中的python函数


提前感谢。

发生死锁是因为您正在通过
rt.block\u on()
阻塞主线程,从而阻止Python事件循环运行要返回
block\u on()
调用所需的协程。这种循环依赖会导致死锁。您可以将
block_on()
更改为
spawn()
,以防止死锁,但我对异步Python还不太熟悉,无法帮助您实际完成协同程序。您可能还想看看
pyo3\u asyncio::tokio::get\u runtime()
,这样就不会为每个调用创建新的运行时。
lib.rs
#[pyclass]
struct Server {}

#[pymethods]
impl Server {
    #[new]
    fn new() -> Self {
        Self {}
    }

    fn start(mut self_: PyRefMut<Self>, test: &PyAny) {


        let f = pyo3_asyncio::into_future(test);
        let rt = tokio::runtime::Runtime::new().unwrap();
        rt.block_on(async {
            let x = f.unwrap().await;
            match &x {
                Ok(_) => (),
                Err(v) => println!("{}", v),
            }
        });
    }
}

#[pymodule]
pub fn roadrunner(py: Python<'_>, m: &PyModule) -> PyResult<()> {
    m.add_class::<Server>()?;
    pyo3_asyncio::try_init(py);
    Ok(())
}

#index.py
import rust_package

async def h():
    print("hhh")


print("Hello world")
s = roadrunner.Server()
s.start(h)