3

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

例如

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

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

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

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

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

4

1 回答 1

4
  1. 是的,应该这样做。它不是轮询:执行时receive,线程扫描其邮箱以查找匹配的消息,如果找到,则继续,如果未找到消息,调度程序(运行 VM 的 os 线程)暂停线程的执行,直到匹配的消息可用(或提供给过期的receive超时,如果有)。
  2. 不,这不是一个忙碌的等待,因为在receive匹配消息可用之前会阻塞。您可以使用io:format()或轻松检查dbg
  3. 这就是你在这里所做的,“父”线程产生一些其他线程来执行一些任务并报告回来。“父”线程只是等待所有任务完成。
  4. 您应该使用spawn_linkor spawn_monitor,否则“子”线程可能会死掉,“父”将永远等待不会出现的消息。
于 2021-04-24T00:48:42.333 回答