- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在研究如何在 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 进程通信的 Genservers?这甚至可能吗?我应该以不同的方式解决我的问题吗?
最佳答案
如果你能让 Lua 代码——或者更准确地说,它的底层原生代码——与 Erlang VM 合作,你有几个选择。
考虑 Erlang VM 最重要的功能之一:管理(可能大量)Erlang 轻量级进程跨一组相对较小的调度程序线程的执行。它使用多种技术来了解进程何时用完其时间片或正在等待,因此应该安排它以让另一个进程有机会运行。
您似乎在问如何让 native 代码在 VM 中以它喜欢的方式运行,但是正如您已经暗示的那样, native 代码可能导致 VM 出现问题的原因是它没有实用的方法来停止 native 代码完全接管调度程序线程,从而阻止常规 Erlang 进程执行。因此, native 代码必须协同将调度程序线程交还给 VM。
对于较旧的 NIF,此类合作的选择是:
enif_schedule_nif
function 协作产生调度程序线程.要使用此功能, native 代码必须能够在块中完成其工作,以便每个块都可以在通常的 1 毫秒 NIF 执行窗口内完成,类似于前面提到的方法,但不需要人为地返回到 Erlang 包装器。我的
bitwise example code提供了许多有关此的详细信息。
enif_schedule_nif
前面提到的在脏调度程序上执行 NIF 的函数。我的
bitwise example code也提供了许多有关此的详细信息。脏调度器也将保留为 Erlang 18 的实验性功能。
recv
调用,驱动程序代码可以注册套接字文件描述符,以便虚拟机可以轮询它并在文件描述符变得可读时调用驱动程序。
关于c - Erlang 产生大量 C 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30696094/
我想实现一个 Erlang 解释器,最近我在阅读 Erlang 的标准库源代码。我在 erlang.erl 中找到 erlang:display/1 的源代码是: %% display/1 -spec
我即将用 Erlang 构建一个系统(我的问题可以用多个 CPU 更好地解决),我已经浏览了: 向你学习一些 Erlang; Erlang/OTP 在行动 编程 Erlang(阿姆斯壮); Erlan
我真的很难理解 Erlang 中的尾递归。 我有以下 eunit 测试: db_write_many_test() -> Db = db:new(), Db1 = db:write(f
我不确定或者我不知道 erlang 定位不在默认目录中的模块的传统方式。我知道它会查看已编译的文件夹和 erlang 的系统文件夹或 - lists:foreach(fun (E) -> io:fwr
对 Erlang 完全陌生。我正在尝试为函数组合定义一些函数,例如 compose , juxt和 pipe但是遇到这样一个事实,即 Erlang 没有(据我所知)可变参数,因此很难只编写适用于所有输
在 Erlang 中存储和管理高性能可变对象的最佳方法是什么?假设我想编写具有实时游戏玩法的非常简单的在线游戏服务器。不知何故,我需要在 Erlang 内存中表示玩家的状态。例如,它可能只是一个简单的
警告:前面的 erlang n00b。 我正在尝试掌握 erlang,只是尝试与牛仔一起使用基本的 hello world 应用程序。我正在模拟一个错误,基本上是在我的代码中的某处返回一个无效值,并试
当你向 shell 进程发送消息时,你可以通过调用: c:flush(). 来清除所有消息。 C:\Windows\System32>erl Eshell V5.9(使用 ^G 中止) 1> 自我()
这应该是一个简单的问题,但我不太了解文档,无法找到答案。 如果 OTP 管理器在崩溃后重新启动 gen_server,新子进程是否继承了崩溃进程的消息队列,或者消息是否在崩溃之前发送但尚未由旧子进程处
我将 net_ticktime 值设置为 600 秒。 net_kernel:set_net_ticktime(600) 在 net_ticktime = TickTime 的 Erlang 文档中:
我正在监视一个 Erlang 应用程序,我目前正在尝试确定特定 PID 已经运行了多长时间。绝对时间戳或持续时间对我有用,但我在 process_info 或通过 sys 模块看不到这些数据位中的任何
我想重新定义查找特定单词的元组的顺序 例如,我有一个像这样的元组列表: [{"a",["r001"]}, {"bi",["bidder"]}, {"bo",["an"]}] 但有时元组的顺序可能会
以下几行出现在 http://aosabook.org/en/riak.html 中,在该部分的第二段: 15.1. Erlang 简介 : "Calling the function with a
我认为 Erlang 节点之间的消息不应该很大。如果我想构建一个流服务器,通常每个连接都需要很大的带宽,Erlang 能做好吗?如果是,是否有任何开源代码可供我学习?我了解到 Erlang 很适合处理
下一个代码在结果中给了我 5.999999999999998,但正确答案是 6。 Alpha = math:acos((4*4 + 5*5 - 3*3) / (2*4*5)) Area = 1/2 *
注意:这是我的 previous question 的进化延续。关于类似的话题。 一段时间以来,我一直在寻找有关部署和更新 Erlang/OTP 版本(一组应用程序)的“最佳实践”,但我找不到任何直接
我试图在头文件中指定一个函数。 像这样: -spec update(pid(), tuple(tuple(), integer(), atom()), tuple(atom(), atom())) -
所以我在过去的八个小时里一直在使用 Erlang,我花了两个时间用我的头敲击键盘试图找出我的控制台不断返回的异常错误。 我正在编写一个骰子程序来学习erlang。我希望它能够通过 erlang 解释器
当我编译以下模块时: -module(x). -export([inp/0]). f(X) -> g(X). g(X) -> error(X). inp() -> f(123)
我目前正在开发一个实时媒体服务器,它将允许普通消费者向我们发送实时视频。在我们当前的环境中,我们已经看到发送给我们的广播持续了几天,因此能够在不断开用户连接的情况下修复错误(或添加功能)的想法非常引人
我是一名优秀的程序员,十分优秀!