Erlang:带有多个超时子句的接收语句

发布于 2024-08-02 20:53:54 字数 468 浏览 2 评论 0原文

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

我想做一些类似的事情

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

,具体取决于 Timeout1Timeout2 中哪个较小,doSomething1()doSomething2 > 被调用。但是,上面的代码会导致语法错误。

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

提前致谢!

Is it possible for a receive statement to have multiple timeout clauses, and if so, what is the correct syntax?

I want to do something like

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

where, depending on which of Timeout1 or Timeout2 is smaller, doSomething1() or doSomething2 is called. However, the above code causes a syntax error.

If, as I'm beginning to suspect, this is not possible, what is the best way to achieve the same outcome in a suitable Erlangy manner?

Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一腔孤↑勇 2024-08-09 20:53:54

不,你不能。只需在接收之前决定要做什么。

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.

等等

No, you can't. Just decide what to do before receive.

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

or

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

etc.

天荒地未老 2024-08-09 20:53:54

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

You should probably use a combination of 'gen_fsm' and 'timer:send_after'.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文