我有一个程序(C++应用程序),多个线程在erlang模块(genserver)中调用"handle_info()“。
注意到,如果线程-1向此" handle_info()“发送一串消息(例如1000),同时如果线程-2也同时向"handle_info()”发送1或2条消息,则可以观察到,handle_info()只在线程-2完成由Thread-1发送的消息时执行由线程-2发送的消息。
我读过handle_info()是异步的,但在本例中,我发现它像同步方法一样工作。
我做错什么了吗?
注意:
发布于 2019-02-06 19:30:14
可以看到,handle_info()只在完成Thread-1发送的消息时才执行Thread-2发送的消息。
在我看来,Thread-1在Thread-2发送任何消息之前就会发送它的所有消息。gen_server OTP行为不使用选择性接收来处理消息,也就是说,实现不会搜索服务器的邮箱,试图将接收模式与消息匹配。相反,gen_server按邮件到达邮箱的顺序处理服务器邮箱中的每条消息。
该设计的目的是防止内存泄漏。当未处理的邮件在邮箱中累积时,就会发生此类泄漏。gen_server:call/cast发送一条位于服务器邮箱中的消息(或者将退出信号转换为消息并放置在服务器邮箱中,或者套接字导致消息被放置在服务器邮箱中,或者有人使用!直接向服务器发送消息),然后服务器按照邮件到达的顺序处理邮箱中的邮件。对于每一条消息,服务器调用适当的回调函数:
Mod:handle_call()
Mod:handle_cast()
Mod:handle_info()取决于邮件的格式,并从邮箱中删除邮件。
https://stackoverflow.com/questions/54534197
复制相似问题