Erlang进程的消息接收速率

时间:2013-03-27 08:35:06

标签: erlang

Erlang VM中是否有计数器用于每个进程收到的消息? 我需要计算一个工人的信息率。

如果没有,您将如何衡量和计算代码中的消息率​​?

3 个答案:

答案 0 :(得分:2)

您可以使用:

erlang:process_info(Pid, message_queue_len)

您将得到类似的结果:

{message_queue_len, Number}

但也许这不是你想要的。

如果您正在使用OTP,您可以使用@Pascal所说的观察者,或者您可以将状态保持在该状态,并在每次处理呼叫,信息或演员时更新它。

答案 1 :(得分:1)

如果您的进程完全符合OTP(例如,gen_server,gen_event,gen_fsm),则可以使用sys:statistics/2,3来跟踪messages_in / messages_out速率。根据我从文档中收集的内容,您使用Flag = true调用它,等待一段时间,然后使用Flag = get再次调用它(不确定是否必须再次使用Flag = false调用它)。 / p>

话虽如此,没有OTP合规性,这样做相对容易。设置一个计时器(我建议erlang:start_timer通过计时器模块)在N毫秒后向您的进程发送一条消息,并计算您收到的消息数。当您收到来自计时器的消息时,将计数除以N表示每毫秒的速率(乘以每秒的速率为1000)。冲洗并重复。

如果您从回调模块执行此操作,或者使用基于接收块的进程处理各种消息(在这种情况下,您应该将其转换为回调表单),这会有点单调乏味),所以我不推荐它。因此,如果您正在使用OTP进程,请使用sys模块以保证您的理智。

答案 2 :(得分:0)

如果你已经构建了一个OTP应用程序,那么我想你可以使用观察者应用程序。

只需在执行OTP应用程序的VM中运行observer:start()即可查看。