您不是在安排事件,而是在安排消息。
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/ 任何地方;没有可靠的(阅读:不是 hacky)方法可以从 VM 中检索此信息。