我是Erlang的新手,有一个关于receive块的问题。我试图从一个正在执行任务的子进程接收一条或多条消息。我发现如何接收消息的方法是使用receive块。
例如:
main() ->
spawn(module, performSomething, []),
receiveSomething().
receiveSomething() ->
receive
Var -> handleIt
end,
receiveSomething().
问题1:假设子进程可以向需要处理消息的父进程发送多条消息,那么“轮询”此接收块是否是一种好的做法?例如,是否应该这样管理它?
问题2:感觉像是某种忙碌的等待,是吗?例如,它是否会导致性能问题?
问题3:在Objective-C中,我会使用委托来接收回调并避免轮询。在Erlang中有替代方法吗?
1条答案
按热度按时间biswetbf1#
1.是的,应该这样做。这不是轮询:当执行
receive
时,线程扫描其邮箱以寻找匹配的消息,如果找到,则继续,如果未找到消息,则调度程序(运行VM的操作系统线程)暂停线程的执行,直到匹配的消息可用(或者提供给receive
的超时到期,如果有的话)。1.不,这不是一个忙碌等待,因为
receive
会一直阻塞,直到有匹配的消息可用。您可以使用io:format()
或dbg
轻松地检查它。1.这就是您在这里所做的,“父”线程产生一些其他线程来执行一些任务并返回报告。“父”线程只是等待所有任务完成。
1.您应该使用
spawn_link
或spawn_monitor
,否则“子”线程可能会死亡,“父”线程将永远等待不会到来的消息。