问题描述
我正在尝试使用rlua-async运行/编写现有的rust异步代码。遗憾的是,它没有得到很好的说明,也没有示例,但是我在定义异步函数方面占了上风,但是在以异步方式执行lua代码方面却遇到了麻烦。
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,以获取更多信息。