Elixir获取所有计划的消息

时间:2018-08-14 09:19:24

标签: erlang elixir otp

我正在使用以下Process.send_after来安排一些活动,我的问题是给定的pid我可以获取所有安排的活动吗?

1 个答案:

答案 0 :(得分:2)

您没有安排事件,而是安排了消息

Process.send_after/4返回对计时器的引用。从那时起,发送方和接收方都没有与此计划消息有任何共同之处,直到它被传递给接收方为止(如果接收方死亡,则被ErlangVM取消。)由ErlangVM处理,直到计时器到期。它会e。 G。如果PID指定的接收器已消失,则取消。

也就是说,没有任何手动记录,这是不可能的。 可能是检查具有PID的进程的邮箱。也就是说,如果计时器已经到期,并且接收方尚未使用该消息,则可能会查询它:

Process.send_after(self(), :hi, 10)
#⇒ #Reference<0.3363662940.2222456833.225763>
:erlang.process_info(self(), :message_queue_len)
#⇒ {:message_queue_len, 1}
:erlang.process_info(self(), :messages)
#⇒ {:messages, [:hi]}

您可能相对容易地获得尚未使用的消息数;您应该收集Process.send_after/4返回的计时器引用,以便稍后可以查询:

timers = 
  [
    Process.send_after(self(), :hi, 1_000_000),
    Process.send_after(self(), :hi, 1_000),
    Process.send_after(self(), :hi, 1_000_000)
  ]
#⇒ [#Reference<0.3363662940.2222456833.225820>, ...]

timers
|> Enum.map(&Process.read_timer/1)
|> Enum.count(& &1)
#⇒ 2

如果要复制ErlangVM的功能,则可以将消息存储在ETS / DETS /任何位置;没有可靠的方法(读取:不是恶意的)从VM检索此信息。