#lua #actix #actix-actor #actor #send-message #programming-language

actix-lua

使用 Lua 编程语言为 actix 提供安全的脚本环境

15 个版本 (6 个重大更改)

0.7.0 2019 年 2 月 10 日
0.5.2 2018 年 12 月 5 日
0.5.1 2018 年 10 月 28 日
0.1.1 2018 年 7 月 27 日

#actix-actor 中排名第 28

每月下载量 30
torchbear 中使用

MIT 许可证

45KB
1K SLoC

actix-lua

Build Status Latest Version API Documentation

使用 Lua 编程语言为 actix 提供安全的脚本环境

  • 每个 LuaActor 都是一个独立的 Lua 虚拟机。
  • 使用预定义的消息类型(如 StringIntegerNumberBooleanNilTable)在演员之间进行通信。
  • 使用 Lua 协程在演员之间异步发送 send

有关“安全性”的更多信息,请参阅 rlua 的 README

概述

基本的 Lua 演员示例

extern crate actix_lua;
use actix_lua::{LuaActorBuilder, LuaMessage};

fn main () {
    let addr = LuaActorBuilder::new()
        .on_handle_with_lua(r#"return ctx.msg + 42"#)
        .build()
        .unwrap()
        .start();

    let res = addr.send(LuaMessage:from(100));
    // return: 142
}

您可以使用 ctx.send 异步地向其他演员发送消息

struct Callback;
impl Actor for Callback {
    type Context = Context<Self>;
}

impl Handler<LuaMessage> for Callback {
    type Result = LuaMessage;

    fn handle(&mut self, msg: LuaMessage, _ctx: &mut Context<Self>) -> Self::Result {
        LuaMessage::String("hello".to_string())
    }
}

let mut actor = LuaActorBuilder::new()
    // create a new LuaActor from a lua script when the actor is started.
    // send message to the newly created actor with `ctx.send`, block and wait for its response.
    .on_started_with_lua(
        r#"
    local result = ctx.send("callback, "Hello")
    print(result) -- print "hello"
    "#).build()
    .unwrap();

actor.add_recipients("callback", Callback.start().recipient());

actor.start();

安装

actix-lua 添加到您的 Cargo.toml

[dependencies]
actix-lua = "0.5"

示例

请查看 示例目录

还有一篇关于使用 actix-lua 分析流数据的文章。 链接

Lua 演员示例

使用 LuaActor 将 Lua 脚本与您的系统集成到演员模型中。

消息

在演员模型中,演员通过消息进行通信。 LuaMessageLuaActor 接受的唯一消息类型。

  • LuaMessage 可以使用 LuaMessage::from() 转换为/从原始类型。
  • Lua 类型(例如数字、表)将自动转换为 LuaMessage

Lua API

注意:请勿在 Lua 脚本中声明全局变量。这可能会与未来的 actix-lua 更新冲突并破坏您的程序。

ctx.msg

发送给 Lua 演员的消息。

ctx.notify(msg)

向自身发送消息 msg

ctx.notify_later(msg,seconds)

在指定的时间后向自身发送消息 msg

local result=ctx.send(recipient,msg)

异步发送消息 msg 给 `recipient` 并等待响应。

相当于 actix::Recipient.send

ctx.do_send(recipient,msg)

recipient 发送消息 msg

相当于 actix::Recipient.do_send

ctx.terminate()

终止演员执行。

许可证

MIT许可证

依赖

约13MB
约218K SLoC