gpt4 book ai didi

concurrency - 在 erlang 中轮询接收 block 是好的做法吗?

转载 作者:行者123 更新时间:2023-12-04 01:03:44 25 4
gpt4 key购买 nike

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

例如

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

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

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

问题2:感觉是在忙等待,是吗?例如。它会导致性能问题吗?

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

最佳答案

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

关于concurrency - 在 erlang 中轮询接收 block 是好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67235348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com