如何使用rlua-async执行异步lua代码?

问题描述

我正在尝试使用rlua-async运行/编写现有的rust异步代码。遗憾的是,它没有得到很好的说明,也没有示例,但是我在定义异步函数方面占了上风,但是在以异步方式执行lua代码方面却遇到了麻烦。

我创建了一个最小的存储库来重现问题here

use rlua::{Lua};
use rlua_async::{ChunkExt,ContextExt};

#[actix_rt::main]
async fn main() {
    let lua_code = "my.asyncfunc(42)";
    let lua = Lua::new();

    lua.context(|lua_ctx| {
        let globals = lua_ctx.globals();
        let map_table = lua_ctx.create_table().unwrap();
        map_table
            .set(
                "asyncfunc",lua_ctx
                    .create_async_function(
                        |_ctx,param:
                            u32
                        | async move {
                            println!("async function called {}",param);
                            Ok(())
                        }).unwrap()).unwrap();

        globals.set("my",map_table).unwrap();
    });

    lua.context(|lua_context| async move {
        let chunk = lua_context
            .load(&lua_code);
        chunk.exec_async(lua_context).await.unwrap();
    })
        .await;
    println!("finished");
}

但是我收到此错误消息:

error: lifetime may not live long enough
  --> src\main.rs:28:31
   |
28 |       lua.context(|lua_context| async move {
   |  __________________------------_^
   | |                  |          |
   | |                  |          return type of closure is impl Future
   | |                  has type `LuaContext<'1>`
29 | |         let chunk = lua_context
30 | |             .load(&lua_code);
31 | |         chunk.exec_async(lua_context).await.unwrap();
32 | |     })
   | |_____^ returning this value requires that `'1` must outlive `'2`

我真的不知道该错误试图告诉我什么,并且没有有用的提示甚至文档也没有链接

闭包与闭包主体有某种不同,需要使用生命周期注释吗?但是为什么以及如何...?

编辑:如果我改为在没有异步的情况下调用代码,则这样:

lua.context(|lua_context| {
    let chunk = lua_context.load(&lua_code);
    chunk.exec().unwrap();
});

它可以编译,但是在运行时出现以下恐慌:

thread 'main' panicked at 'cannot access a scoped thread local variable without calling `set` first',C:\Users\ahallmann\.cargo\registry\src\github.com-1ecc6299db9ec823\scoped-tls-1.0.0\src\lib.rs:168:9

如果我使用create_function定义函数,则一切正常。

解决方法

我在rlua-async的作者的帮助下弄清楚了。 问题在于actix-rt本身,因为它要求block_on调用的静态寿命。

如果您使用期货或东京证券交易所,则效果很好:

        tokio::runtime::Runtime::new()
            .unwrap()
            .block_on(chunk.exec_async(ctx))

请参见https://github.com/actix/actix-net/issues/201 要么 https://github.com/Ekleog/rlua-async/issues/1,以获取更多信息。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...