重新启动 erlang 进程并保留状态

2024-02-29

我有一个主管进程,它启动多个子进程。目前,当孩子死亡时,我会生成一个具有新 Pid 的新进程。这意味着我丢失了刚刚死亡的子进程的状态信息。我希望我的客户始终使用相同的标识符与子进程进行通信。尽管子进程可能会死亡并由主管重新启动。

我正在考虑使用唯一的名称注册子进程并将子状态存储在 ets 表中。问题是 - 在 Erlang 中解决此类问题的推荐方法是什么?

Thanks!


将进程状态存储在 ets 表中可以在崩溃之间保持状态,并且我通常使用全局注册表来为进程提供持久名称。 (玩家 200 将注册为 {player, 200}。)我不建议使用本地注册表,因为它要求您使用原子,并且如果您有很多子进程,您可以通过以下方式快速耗尽原子限制动态创建它们(如player_200、player_201等)

不过,将子状态存储在 ets 表中也有其自身的风险和问题。如果子进程在发生错误和保存到 ets 表之间发生崩溃,那么应该没问题。但是,如果您处理的数据导致子级保存垃圾状态,然后在处理下一条消息时崩溃,该怎么办?您将重新启动该进程,从 ets 表加载错误状态,并在收到下一条消息时再次崩溃。当然有一些方法可以解决这个问题,但您应该意识到这是一种可能性并解决它。

虽然 Erlang 隐藏了将 ets 表分配给所有进程的问题,但它是以 CPU 和潜在争用为代价的。如果您要对 ets 表进行大量更改,那么您将付出性能代价。

如果你的孩子崩溃了,你难道不应该为他们寻找一种方法来消除错误的情况吗?我通常会将进程崩溃视为我需要根本原因并修复的问题。 ?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重新启动 erlang 进程并保留状态 的相关文章

  • rabbitmq-erlang-client,使用 rebar 友好的 pkg,在开发环境上工作在 rebar 版本上失败

    我成功地将rabbitmq erlang client的rebar友好包用于一个简单的Hello World rebarized和OTP 兼容 应用程序 并且在开发环境中工作正常 我能够启动 erl 控制台并执行我的操作applicatio
  • Erlang:如何从体内引用匿名函数?

    In Erlang http en wikipedia org wiki Erlang programming language 有没有办法引用当前正在执行的函数 这对于产生无限循环很有用 spawn fun gt do something
  • Erlang中如何维护状态?

    我见过人们使用口述 命令 记录用于维护我读过的许多博客中的状态 我发现这是一个非常重要的概念 一般来说 我理解维护状态和递归的含义 但是当涉及到 Erlang 时 我对它的处理方式有点模糊 有什么帮助吗 维护状态的最简单方法是使用gen s
  • 在 Windows 上编译 Erlang 代码

    我安装了 Erlang 13B 并尝试按照教程进行操作 每次我到达c tut 我得到一个错误而不是 ok tut 所以看起来没有安装任何模块 有人能指出我正确的方向吗 我尝试过 Emacs 但我真的不知道如何使用它 甚至还没有接近让 Erl
  • 构建 Erlang 服务器场(用于业余爱好项目)最便宜的方法是什么? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 假设我们有一个 本质上并行 的问题需要用 Erlang 软件来解决 我们有很多并行进程 每个进程都执行顺序代码 不是数字运算 并且我们向它们投入的 C
  • 为什么使用erts_debug:size/1时atom的内存为零?

    I use erts debug size 1计算erlang VM中atom的内存 但我发现输出为零 谁能解释一下原因 7 gt erts debug size true 0 原因是原子与原子的数据一起保存在原子表中 因此整个节点中只有一
  • 与共享数据相比,消息传递的性能损失

    最近有很多关于不使用锁和使用 Erlang 等消息传递方法的讨论 或者关于使用不可变的数据结构 例如函数式编程与 C Java 中的比较 但我关心的是以下几点 AFAIK Erlang 不保证消息传递 消息可能会丢失 如果还要担心消息丢失
  • 您应该将应用程序属性放在 rebar erlang 应用程序中的什么位置?

    新手问题 我编写了第一个基于 rebar 的 erlang 应用程序 我想配置一些基本属性 例如服务器主机等 放置它们的最佳位置在哪里以及如何将它们加载到应用程序中 接下来的步骤是发布版本并在其中创建节点 节点在独立的 Erlang VM
  • 检查 Erlang 中的活动计时器

    有没有一种简单的方法来获取所有当前等待的计时器的列表erlang send after erlang apply after等在Erlang中 出于调试目的 您可以使用dbg 首先创建一个 ets 表来存储所有计时器引用 1 gt ets
  • Erlang 更好地支持哪种数据库(SQL)?

    你建议我在 Erlang 中使用什么 MySQL 还是 Postgres 哪个数据库有更好 更成熟 更稳定 更快 的 Erlang 驱动程序 The Erlang ODBC 接口 http erlang org doc apps odbc
  • 拦截登录/注销ejabberd

    我想知道用户何时在自定义模块中的 ejabberd 会话中登录和注销 而不更改 ejabberd 代码 我需要它 因为我必须在用户登录时执行一些操作 并清理用户注销时执行的操作 另外 在某些情况下我需要能够注销用户 那么 有没有办法扩展某些
  • 停止 Erlang 守护进程

    除了跑步 killall 9 beam smp 当我知道 Erlang 节点的情况时 如何以编程方式杀死它 sname 如果我不希望心跳监视器重新启动该进程 如何确保上述问题的任何答案也会终止心跳 有没有一个不错的指南来将 Erlang 部
  • Mnesia:如何同时锁定多行,以便我可以写入/读取一组“一致”的记录

    我多么希望我一开始就能表达我的问题 取一个包含 26 个键 a z 的表 并让它们具有整数值 创建一个流程 哎哟 一遍又一遍地做两件事 在一笔交易中 写入随机值a b and c使得这些值always总和为 10 在另一个事务中 读取值a
  • Erlang get_tcp:recv数据长度

    I user gen tcp recv Socket 0 用于数据接收 但我只能接收1次1418字节 我怎样才能收到发送的数据量 in gen tcp recv Socket 0 您正在询问内核 给我接收缓冲区中现在可用的所有数据 不过 内
  • 如何在 Erlang 中将数字转换为单词?

    我发现了一个关于将数字转换为 单词 的有趣问题 代码高尔夫 数字到单词 https stackoverflow com questions 309884 code golf number to words 我真的很想看看你如何在 Erlan
  • 在 digraph_utils:is_acirclic/1 返回 false 后查找循环或循环

    我怎样才能 有效地 在Erlang有向图中找到循环或循环digraph utils is acyclic 1返回假 EDIT is acyclic is 定义为 https github com erlang otp blob maint
  • Erlang gen_tcp 连接问题

    简单的问题 这段代码 client gt SomeHostInNet localhost to make it runnable on one machine ok Sock gen tcp connect SomeHostInNet 56
  • Erlang:将元素“添加到元组之前”

    是否可以编写一个与此函数等效的更快的函数 prepend X Tuple gt list to tuple X tuple to list Tuple 在我看来 这种事情是不被鼓励的 如果您想要一个列表 请使用一个 Erlang 入门 ht
  • Erlang:有“epmd”的 API 吗?

    有没有办法查询 epmd 守护进程管理的名称表 The nodes 函数在这方面不是很有帮助 注意 我正在寻找 APIaside解析通过 stdout 生成的输出 要查询 epmd 可见的节点 请调用 EpmdModule net kern
  • 如何在 gen_servers 中进行选择性接收?

    我将大部分应用程序移植到 OTP 行为 但我陷入困境 我不知道如何使用 gen server 进行选择性接收 如果没有任何回调函数子句与消息匹配 则不会将消息放回邮箱 而是会出错 现在 无论我走到哪里 人们都称赞选择性接收 无论我走到哪里

随机推荐

  • 没有工作树就无法使用 git-pull

    我正在尝试从我刚刚设置的远程存储库中提取数据 并且收到了消息 没有工作树就无法使用 git pull 我读过的所有内容似乎都指向我的 git 目录 但看起来不错 git branch 给出输出 master and git ls tree
  • 处理回发数据中的数组 - MVC3

    我目前是一名 WebForms 开发人员 正在尝试转向 MVC 我对 MVC 感到非常兴奋 而且我真的很开心 但我遇到了一个奇怪的问题 所以我想做的是为 小部件 创建一个高级编辑器 我已经发布了下面的代码 当您添加前 4 5 个项目时 一切
  • python asyncio 和 httpx

    我对异步编程非常陌生 我正在尝试使用 httpx 我有以下代码 我确信我做错了什么 只是不知道它是什么 有两种方法 一种是同步 另一种是异步 它们都来自谷歌金融 在我的系统上 我看到花费的时间如下 异步 5 015218734741211同
  • 整洁地替换为一个奇怪的字符

    我正在使用 Tidy 带有 PHP5 并启用 UTF8 输入 输出和字符编码 当我用清洁器清洁绳子时 nbsp 在其中 它用一个奇怪的字符替换它 我尝试过弄乱整洁的配置 但我尝试的任何操作似乎都不起作用 整理前 This is a test
  • GDB - 神秘的汇编代码是什么?

    Dump of assembler code for function main 0x0804833e lt 0 gt push ebp 0x0804833f lt 1 gt mov esp ebp 0x08048341 lt 3 gt s
  • 指标过滤器未分配给指标警报

    我正在使用 terraform 设置 aws cloudwatch 日志 以便在日志中出现错误时发送电子邮件 terraform 文件如下所示 resource aws cloudwatch log metric filter error
  • 对象配置必须是包含 yii2 和 mongodb 中“class”元素的数组

    登录或注册时出现错误 gt yii2 mongodb给出一个错误 MongoDB 与 yii2 的连接已完成 请帮我解决这个问题 main local php return components gt mongodb gt class gt
  • 如何在 Vuetify 行上将“光标”设置为“指针”?

    如何设置cursor pointer在 Vuetify 上
  • Xcode 4.x 中代码自动完成/语法突出显示的问题

    我在我的一个项目中的 Xcode 中遇到了一个相当奇怪的问题 当我开始编写代码时 我习惯了自动完成功能为我建议大量条目 由于某种原因 从昨天开始 它就停止工作了 我现在收到奇怪的自动完成条目 例如 and the Andy MyCompan
  • 找出按下的键的字符

    如果我向 KeyboardEvent KEY DOWN 添加一个侦听器 我可以找到 keyCode 和 charCode keyCode 根据键盘映射到不同的字符 根据帮助 charCode 同样没用 字符代码值是英文键盘值 例如 如果按
  • 如何使用 PHP 过滤 MySQL 中的数据(一对多关系)

    我想做的事 用户将使用发送一个值GET我会将值存储在名为的变量中 category1 现在包含值的所有行 category1将显示 这就像一个搜索系统 这是我的代码 stmt conn gt prepare SELECT tmdb movi
  • PHP 中有一个像样的 HTML-table-generator 类吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在 PHP 中寻找一个像样的类 它将生成复杂的 HTML 表格 即它应该支持 colspan rowspan 以及行 列和单元格的单独
  • 身份验证类型名称如何在 asp.net vnext 中注册

    因此 我正在更新 MongoDB 的开源 asp net 身份提供程序 以便与 Asp Net Identity 3 0 又名 vnext 配合使用 到目前为止 我已经能够注册提供程序并创建用户 但是在使用 SignInManager 时
  • 从缓存对象中转换 ValueTuple

    当我检查缓存以查看我的 ValueTuple 是否在缓存中时 我使用下面的代码 在这种情况下 返回的值为 null 即缓存中不存在 当代码运行时我得到object not set to instance of an object第一行错误
  • 如何测试 AccessViolationException 的处理

    我需要编写一个测试来验证我的代码是否可以处理 AccessViolationException 或任何其他 WIN32 损坏状态异常 CSE 该异常在不安全的上下文中发生 通常通过调用第 3 方库来处理 这一切都应该在 net 4 0 上使
  • 如何在 IPython 笔记本中播放本地视频?

    我有一个本地视频文件 avi 但可以转换 我想向客户端展示该文件 即它是私有的 无法发布到网络 但我不知道如何在 IPython 笔记本中播放它 经过一番谷歌搜索后 似乎 HTML5 视频标签可能是可行的方法 但我不知道任何 html 无法
  • 部署应用程序时如何避免安装“无限强度”JCE策略文件?

    我有一个使用 256 位 AES 加密的应用程序 Java 不支持该加密 我知道为了让它正常工作 我在安全文件夹中安装了 JCE 无限强度 jar 这对我作为开发人员来说很好 我可以安装它们 我的问题是 由于此应用程序将被分发 最终用户很可
  • 获取我在 Sql Server 中更新的行的 Id

    我正在尝试返回在 sql 中更新的行的 Id UPDATE ITS2 UserNames SET AupIp AupIp WHERE Customer ID TCID AND Handle ID ID SELECT ERROR AS Err
  • 为什么第一个 WCF 客户端调用很慢?

    我试图弄清楚为什么客户端应用程序启动后的第一个 WCF 调用比第二个调用花费更多的时间 我做了什么来测试 实现了简单的自托管 WCF 服务器和控制台客户端 服务器已预热 在运行测试之前我运行它并调用方法几次 绑定是basicHttpBind
  • 重新启动 erlang 进程并保留状态

    我有一个主管进程 它启动多个子进程 目前 当孩子死亡时 我会生成一个具有新 Pid 的新进程 这意味着我丢失了刚刚死亡的子进程的状态信息 我希望我的客户始终使用相同的标识符与子进程进行通信 尽管子进程可能会死亡并由主管重新启动 我正在考虑使