【问题标题】:Elixir get all scheduled messagesElixir 获取所有预定消息
【发布时间】:2019-01-21 02:33:03
【问题描述】:

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

【问题讨论】:

  • 不,因为它没有在进程中注册,并且该进程可能会提前退出。为什么不在 ets 中保存引用?
  • 你可以试试这个主题的解决方案 - stackoverflow.com/questions/4052451/…

标签: erlang elixir erlang-otp


【解决方案1】:

您不是在安排事件,而是在安排消息

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 中检索此信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-26
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2021-03-30
    • 1970-01-01
    相关资源
    最近更新 更多