【发布时间】:2015-08-22 03:34:47
【问题描述】:
我一直在研究如何在 Erlang 中嵌入语言(我们以 Lua 为例)。这当然不是一个新想法,并且有很多图书馆可以做到这一点。但是我想知道是否可以启动一个由 Lua 修改的状态的 Genserver。这意味着一旦您启动 Genserver,它将启动一个(长时间运行的)Lua 进程来操作 Genserver 的状态。我知道这也是可能的,但我想知道我是否可以生成 1,000 10,000 甚至 100,000 个这样的进程。
我对这个话题不是很熟悉,但我做了一些研究。 (如果我对这些选项中的任何一个有误,请纠正我)。
TLDR;跳到最后一段。
第一个选项:NIF:
这似乎不是一个选项,因为它会阻止当前进程的 Erlang 调度程序。如果我想生成大量这些,它将冻结整个运行时。
第二个选项:端口驱动:
它类似于NIF,但通过向指定端口发送数据进行通信,该端口也可以将数据发送回Erlang。这很好,尽管这似乎也阻止了调度程序。我尝试了一个库,它也为你做样板,但这似乎在产生 10 个进程后阻塞了调度程序。我还查看了 Erlang 文档中的 postgresql 示例,据说它是异步的,但我无法让示例代码正常工作(R13?)。是否有可能在不阻塞运行时的情况下运行尽可能多的端口驱动程序进程?
第三个选项:C 节点:
我认为这很有趣并想尝试一下,但显然“erlang-lua”项目已经这样做了。这很好,因为如果出现问题并且进程被隔离,它不会使您的 Erlang VM 崩溃。但是为了真正产生一个进程,你需要产生一个完整的节点。我不知道这有多贵。我也不确定连接集群中的节点的限制是什么,但我没有看到自己产生 100,000 个 C 节点。
第四个选项:端口:
起初我以为这与端口驱动程序相同,但实际上有所不同。您生成一个执行应用程序并通过 STDIN 和 STDOUT 进行通信的进程。这对于生成大量进程非常有效,而且(我认为?)它们不会对 Erlang VM 构成威胁。但是,如果我要通过 STDIN / STDOUT 进行通信,为什么还要从一开始就使用嵌入式语言呢?不妨使用任何其他脚本语言。
因此,在我不熟悉的领域进行了大量研究之后,我来到了这里。您可以将 Genserver 作为 AI 用 Lua 编写的“实体”。这就是为什么我想为每个实体都有一个流程。我的问题是如何生成许多与长期运行的 Lua 进程通信的 Genserver?这甚至可能吗?我应该以不同的方式解决我的问题吗?
【问题讨论】:
-
Lua代码真的需要完全接管底层内核线程吗?或者它是否可以设置为可以注册某种回调或通知,以便它可以将内核线程返回给 Erlang,然后在它感兴趣的事件发生时被回调?
-
在 Lua 的特定情况下,您可能想查看 github.com/rvirding/luerl,它是 Erlang 中的 Lua 实现。您只需在 erlang 进程中加载和执行 Lua 代码(这样您就可以拥有许多并发的 lua 评估器)。
标签: c multithreading lua erlang ffi