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 检索此信息。
我正在使用以下 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 检索此信息。