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