在 erlang 中轮询接收块是一种好的做法吗?

Posted

技术标签:

【中文标题】在 erlang 中轮询接收块是一种好的做法吗?【英文标题】:Is polling a receive-block in erlang good practice? 【发布时间】:2021-07-17 23:31:23 【问题描述】:

我是 Erlang 新手,对接收块有疑问。我正在尝试从正在执行任务的子进程接收一条或多条消息。我发现如何接收消息的方法是使用接收块。

例如

main() ->
    spawn(module, performSomething, []),
    receiveSomething().

receiveSomething() ->
    receive
        Var -> handleIt
    end,
    receiveSomething(). 

问题 1:假设孩子可能会向需要处理消息的父母发送多条消息,“轮询”这个接收块是一种好的做法吗?例如。应该这样管理吗?

问题 2:感觉像是某种忙碌的等待,是吗?例如。它会导致性能问题吗?

问题 3:在 Objective-C 中,我会使用委托来接收回调并避免轮询。 Erlang 有替代方案吗?

【问题讨论】:

【参考方案1】:
    是的,应该这样做。它不是轮询:当执行receive时,线程扫描它的邮箱以查找匹配的一些消息,如果找到,它会继续,如果没有找到消息,调度程序(运行VM的os线程)暂停执行线程直到匹配消息可用(或提供给 receive 的超时到期,如果有)。 不,这不是忙等待,因为receive 会阻塞,直到匹配的消息可用。您可以通过io:format()dbg 轻松查看。 这就是您在这里所做的,“父”线程会产生一些其他线程来执行某些任务并返回报告。 “父”线程只是等待所有任务完成。 您应该使用spawn_linkspawn_monitor,否则“子”线程可能会死掉,而“父”线程将永远等待不会收到的消息。

【讨论】:

以上是关于在 erlang 中轮询接收块是一种好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 <label> 和它的 <input> 之间使用 <br/> 标签是一种好的做法吗?

使用单个片段显示UI而不是活动是一种好习惯吗?

在数据仓库(关系)中有外键是一种好习惯吗?

大量使用静态成员变量是一种好习惯吗? [复制]

在 Ruby 中显式返回是一种好的风格吗?

在 C 中使用第一个数组元素作为数组长度是一种好的编程习惯吗?