【问题标题】:handle_info() is not able to execute multiple calls concurrentlyhandle_info() 不能同时执行多个调用
【发布时间】:2019-06-29 06:13:33
【问题描述】:

我有一个程序(C++ 应用程序),其中多个线程正在调用用 erlang 模块(genserver)编写的“handle_info()”。

观察到,如果线程 1 向这个“handle_info()”发送了一堆消息(比如 1000 条),同时如果线程 2 也同时向“handle_info( )",观察到handle_info()只有在线程1发送完消息后才会执行线程2发送的消息。

我读到 handle_info() 是异步的,但在这种情况下,我发现它像同步方法一样工作。

我做错了什么吗?

注意:

  1. Thread-1 和 Thread-2 由同一个 erlang 模块生成,线程函数来自 C++ 应用程序。

  2. 线程函数使用“enif_send()”函数(erl_nif.h)调用handle_info()。

【问题讨论】:

  • 请向我们展示您的代码,以便我们查看是否有任何错误可能导致此问题。
  • 他们如何打电话 handle_info()?
  • handle_info 正在使用 enif_send() 函数调用。它被成功调用。但几乎每次我都观察到 Thread-1 消息首先由 handle_info() 处理,然后再处理 Thread-2 消息。

标签: c++ asynchronous erlang gen-server


【解决方案1】:

观察到,handle_info() 执行的是 Thread-2 发送的消息 只有当它完成 Thread-1 发送的消息时。

在我看来,Thread-1 在 Thread-2 发送任何消息之前发送了所有消息。 gen_server OTP 行为不使用选择性接收来处理消息,即实现不搜索服务器的邮箱以尝试将接收模式与消息匹配。相反,gen_server 按顺序处理服务器邮箱中的每条消息,即按照消息到达邮箱的顺序。

该设计的目的是防止内存泄漏。当未处理的邮件在邮箱中堆积时,就会发生这种泄漏。 gen_server:call/cast发送消息落入服务器邮箱(或退出信号转换为消息放入服务器邮箱,或套接字导致消息放入服务器邮箱,或有人直接发送消息到带有!) 的服务器,并且服务器按照它们到达的顺序处理邮箱中的消息。对于每条消息,服务器都会调用相应的回调函数:

Mod:handle_call()
Mod:handle_cast()
Mod:handle_info()

取决于邮件的格式并从邮箱中删除邮件。

【讨论】:

    猜你喜欢
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 2015-07-27
    • 1970-01-01
    相关资源
    最近更新 更多