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

How to execute async lua code with rlua-async?

我正在尝试 run/script 我现有的 Rust 异步代码 rlua-async。遗憾的是,它没有很好的文档记录,也没有示例,但我在定义异步函数方面占了上风,但我无法以异步方式执行 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 调用的静态生命周期。

如果您改用 futures 或 tokio,效果很好:

        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 了解更多信息。