在Erlang中轮询是一种好的接收阻塞做法吗?

mklgxw1f  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(171)

我是Erlang的新手,有一个关于receive块的问题。我试图从一个正在执行任务的子进程接收一条或多条消息。我发现如何接收消息的方法是使用receive块。
例如:

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

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

问题1:假设子进程可以向需要处理消息的父进程发送多条消息,那么“轮询”此接收块是否是一种好的做法?例如,是否应该这样管理它?
问题2:感觉像是某种忙碌的等待,是吗?例如,它是否会导致性能问题?
问题3:在Objective-C中,我会使用委托来接收回调并避免轮询。在Erlang中有替代方法吗?

biswetbf

biswetbf1#

1.是的,应该这样做。这不是轮询:当执行receive时,线程扫描其邮箱以寻找匹配的消息,如果找到,则继续,如果未找到消息,则调度程序(运行VM的操作系统线程)暂停线程的执行,直到匹配的消息可用(或者提供给receive的超时到期,如果有的话)。
1.不,这不是一个忙碌等待,因为receive会一直阻塞,直到有匹配的消息可用。您可以使用io:format()dbg轻松地检查它。
1.这就是您在这里所做的,“父”线程产生一些其他线程来执行一些任务并返回报告。“父”线程只是等待所有任务完成。
1.您应该使用spawn_linkspawn_monitor,否则“子”线程可能会死亡,“父”线程将永远等待不会到来的消息。

相关问题