我有一个程序(C ++应用程序),其中多个线程正在调用用erlang模块(genserver)编写的“ handle_info()”。
可以观察到,如果线程1向“ handle_info()”发送一堆消息(例如1000),并且线程2同时向“ handle_info()发送了1或2条消息, )”,观察到,handle_info()仅在完成线程1发送的消息后才执行线程2发送的消息。
我已经知道handle_info()是异步的,但是在这种情况下,我发现它像同步方法一样工作。
我做错什么了吗?
注意:
线程1和线程2由同一个erlang模块产生,并且线程函数来自C ++应用程序。
线程函数使用“ enif_send()”函数(erl_nif.h)调用handle_info()。
答案 0 :(得分:1)
观察到,handle_info()执行线程2发送的消息 仅当它完成线程1发送的消息时。
在我看来,线程1在线程2发送任何消息之前先发送其所有消息。 gen_server
OTP行为不使用选择性接收来处理消息,即,实现不尝试通过服务器的邮箱搜索来尝试将接收模式与消息进行匹配。相反,gen_server
按顺序处理服务器邮箱中的每条消息,即,按消息到达邮箱的顺序。
该设计的目的是防止内存泄漏。当未处理的邮件堆积在邮箱中时,会发生这种泄漏。 gen_server:call/cast
发送一条落在服务器邮箱中的消息(或退出信号被转换为消息并放置在服务器邮箱中,或者套接字导致一条消息被放置在服务器邮箱中,或者某人发送了一条消息直接使用!
发送到服务器,然后服务器按照到达的顺序处理邮箱中的消息。对于每条消息,服务器都会调用相应的回调函数:
Mod:handle_call()
Mod:handle_cast()
Mod:handle_info()
取决于邮件的格式,并从邮箱中删除邮件。