- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在浏览 erlang 应用程序的代码时,我遇到了一个有趣的设计问题。让我描述一下情况,但由于 PIA,我无法发布任何代码,抱歉。
代码结构为 OTP 应用程序,其中两个 gen_server
模块负责分配某种资源。该应用程序完美运行了一段时间,我们并没有遇到大问题。
当第一个 gen_server
需要检查第二个是否有足够的资源时,棘手的部分就开始了。向第二个 gen_server 发出一个 call
,它本身调用一个实用程序库(在非常非常特殊的情况下)向第一个 gen_server 发出一个 call
。
我对 erlang 比较陌生,但我认为这种情况会使两个 gen_server 互相等待。
这可能是一个设计问题,但我只是想知道 OTP 中是否有任何内置的特殊机制可以防止这种“挂起”。
如有任何帮助,我们将不胜感激。
编辑:总结答案:如果您遇到两个 gen_server
call
以循环方式相互调用的情况,您最好在应用程序设计上多花些时间。
感谢您的帮助:)
最佳答案
这称为死锁,可以/应该在设计层面避免。下面是一个可能的解决方法和一些主观观点,希望能帮助您避免犯错。
虽然有多种方法可以解决您的问题,但“等待”正是 call
正在做的事情。
一种可能的解决方法是从 A 内部生成一个调用 B 的进程,但不会阻止 A 处理来自 B 的调用。该进程将直接回复调用者。
在服务器 A 中:
handle_call(do_spaghetti_call, From, State) ->
spawn(fun() -> gen_server:reply(From, call_server_B(more_spaghetti)) end),
{noreply, State};
handle_call(spaghetti_callback, _From, State) ->
{reply, foobar, State}
在服务器 B 中:
handle_call(more_spaghetti, _From, State) ->
{reply, gen_server:call(server_a, spaghetti_callback), State}
对我来说,这是非常复杂且极难推理的。我认为您甚至可以在不冒犯任何人的情况下将其称为意大利面条代码。
另一方面,虽然上述方法可能会解决您的问题,但您应该仔细考虑这样的调用实际上意味着什么。例如,如果服务器 A 多次执行此调用会怎样?如果在任何时候超时会发生什么?您如何配置超时以使它们有意义? (最内层调用的超时时间必须比外层调用短,等等)。
我会改变设计,即使这很痛苦,因为当你允许它存在并解决它时,你的系统就会变得很难推理。恕我直言,复杂性是万恶之源,应不惜一切代价避免。
关于erlang - 解决两个 gen_tcp 之间的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6036969/
@Cacheable在同一类中方法调用无效 上述图片中,同一个类中genLiveBullets()方法调用同类中的queryLiveByRoom()方法,这样即便标识了Cacheable标签,
目录 @Transaction注解导致动态切换更改数据库失效 使用场景 遇到问题 解决 @Transaction
@RequestBody不能class类型匹配 在首次第一次尝试使用@RequestBody注解 开始加载字符串使用post提交(貌似只能post),加Json数据格式传输的时候,
目录 @Autowired注入static接口问题 @Autowired自动注入普通service很方便 但是如果注入static修饰的serv
目录 @RequestBody部分属性丢失 问题描述 JavaBean实现 Controller实现
目录 解决@PathVariable参数接收不完整的问题 今天遇到的问题是: 解决办法: @PathVariable接受的参
这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚。后来终于找到了原因。 如果你也出现了这种情况,可以从下面开始排查。 1、特性 先来了解一下@Trans
概述: ? 1
场景: 在处理定时任务时,由于这几个方法都是静态方法,在aop的切面中使用@Around注解,进行监控方法调用是否有异常。 发现aop没有生效。 代码如下:
最近做项目的时候 用户提出要上传大图片 一张图片有可能十几兆 本来用的第三方的上传控件 有限制图片上传大小的设置 以前设置的是2M&nb
我已经实现了这个SCIM reference code在我们的应用程序中。 我实现的代码确实通过了此postman link中存在的所有用户测试集合。 。我的 SCIM Api 也被 Azure 接受
我一直对“然后”不被等待的行为感到困扰,我明白其原因。然而,我仍然需要绕过它。这是我的用例。 doWork(family) { return doWork1(family)
我正在尝试查找 channel 中的消息是否仍然存在,但是,我不确定如何解决 promise ,查看其他答案和文档,我可以看到它可能是通过函数实现的,但我是不完全确定如何去做。我希望能在这方面获得一些
我有以下情况: 同一工作区中的 2 个 Eclipse 项目:Apa 和 Bepa(为简洁起见,使用化名)。 Apa 项目引用(包括)Bepa 项目。 我在 Bepa 有一个类 X,具有公共(publ
这个问题已经有答案了: Why am I getting a NoClassDefFoundError in Java? (31 个回答) 已关闭 6 年前。 我正在努力学习 spring。所以我输入
我正在写一个小游戏,屏幕上有许多圆圈在移动。 我在两个线程中管理圈子,如下所示: public void run() { int stepCount = 0; int dx;
我在使用 Sympy 求解方程时遇到问题。当我运行代码时,例如: 打印(校正(10)) 我希望它打印一个数字 f。相反,它给我错误:执行中止。 def correction(r): from
好吧,我制作的每个页面都有这个问题。我不确定我做错了什么,但我所有的页面都不适用于所有分辨率。可能是因为我使用的是宽屏?大声笑我不确定,但在小于宽屏分辨率的情况下,它永远不会看起来正确。它的某些部分你
我正在尝试像这样进行一个非常简单的文化 srting 检查 if(culture.ToUpper() == "ES-ES" || "IT-IT") { //do something } else
Closed. This question is off-topic. It is not currently accepting answers. Learn more。 想改进这个问题吗?Upda
我是一名优秀的程序员,十分优秀!