如何使用 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 了解更多信息。
我正在尝试 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 了解更多信息。