Elixir 获取所有预定消息

Elixir get all scheduled messages

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

您没有安排活动,您安排消息

Process.send_after/4 returns 对计时器的引用。从那时起,发送者和接收者都与这个预定消息没有任何共同点,直到它被传递给接收者(或者如果接收者死了被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 返回的计时器引用,以便稍后您可以查询 then:

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/whereever 中;没有可靠的(阅读:不是 hacky)方法从 VM 检索此信息。