【问题标题】:Erlang: receive statement with multiple timeout clausesErlang:接收带有多个超时子句的语句
【发布时间】:2010-11-24 01:21:24
【问题描述】:

receive 语句是否可以有多个超时子句,如果可以,正确的语法是什么?

我想做类似的事情

foo(Timout1, Timeout2) ->
    receive
    after
        Timeout1 ->
            doSomething1();
        Timeout2 ->
            doSomething2()
    end.

根据Timeout1Timeout2 中的哪一个更小,调用doSomething1()doSomething2。但是,上面的代码会导致语法错误。

如果我开始怀疑这是不可能的,那么以合适的 Erlangy 方式实现相同结果的最佳方法是什么?

提前致谢!

【问题讨论】:

  • 为了可读性,您可能希望使用 timer:sleep(Timeout) 而不是空的接收语句。
  • 谢谢 - 我没有包含任何接收子句,因为它们与这个问题无关。

标签: erlang


【解决方案1】:

不,你不能。在收到之前决定要做什么。

foo(Timeout1, Timeout2) ->
    {Timeout, ToDo} = if Timeout1 < Timeout2 -> {Timout1, fun doSomething1/0};
                         true -> {Timeout2, fun doSomething2/0} end,
    receive
    after Timeout -> ToDo()
    end.

foo(Timeout1, Timeout2) when Timeout1 < Timeout2 ->
    receive
    after Timeout1 -> doSomething1()
    end;
foo(_, Timeout2) ->
    receive
    after Timeout2 -> doSomething2()
    end.

等等

【讨论】:

  • 非常感谢。知道为什么 Erlang 缺少多个超时子句吗?对我来说,它们似乎使代码更简洁、更易于阅读。
  • @grifaton 很简单,因为它可以通过其他方式完成(如 jldupont 建议的那样,以上或使用timer:send_after)。它甚至不能用作模式匹配,可以在“匹配”之外选择分支,如我的解决方案所示。最后,他们使语言尽可能小,因为这是正确的方式(这也是我喜欢它的原因之一)。
【解决方案2】:

您可能应该使用 'gen_fsm' 和 'timer:send_after' 的组合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多