Erlang VM 中是否有针对每个进程接收到的消息的计数器?我需要计算工人的消息率。
如果不是,您将如何测量和计算代码中的消息率?
您可以使用:
erlang:process_info(Pid, message_queue_len)
结果你会得到类似的东西:
{message_queue_len, Number}
但也许这不是你要找的。
如果您使用的是 OTP,您可以像 @Pascal 所说的那样使用观察者,或者您可以将计数器保持在状态,并在每次处理呼叫、信息或演员时更新它。
如果您的流程完全符合 OTP(例如,gen_server、gen_event、gen_fsm),您可以使用它sys:statistics/2,3
来跟踪 messages_in/messages_out 速率。根据我从文档中收集的信息,您使用 Flag = true 调用它,等待一段时间,然后使用 Flag = get 再次调用它(不确定您是否必须再次使用 Flag = false 调用它)。
话虽如此,如果没有 OTP 合规性,它相对容易做到。设置一个计时器(我建议erlang:start_timer
在计时器模块上)在 N 毫秒后向您的进程发送一条消息,并计算您收到的消息数量。当您收到来自计时器的消息时,将计数除以 N 得到每毫秒的速率(乘以 1000 得到每秒的速率)。冲洗并重复。
如果您从回调模块执行此操作,或者使用处理各种消息的基于接收块的进程(在这种情况下无论如何都应该将其转换为回调形式),这会变得有点乏味,所以我不完全推荐它。因此,如果您正在使用 OTP 流程,请使用 sys 模块以确保您的理智。
如果您已经构建了 OTP 应用程序,那么我想您可以使用观察者应用程序。
只需在执行 OTP 应用程序的 VM 中运行 observer:start() 即可查看。