spawn_monitor() 和“DOWN”消息

发布于 2024-08-27 08:45:25 字数 188 浏览 6 评论 0原文

(理论上) 是否有可能被 spawn_monitor() 处理的进程退出(正常退出或出错)而不向父进程发送 'DOWN' 消息?我有一个非常奇怪的进程泄漏,似乎有些进程没有发送 'DOWN' 消息。我使用的是 Ubuntu 9.10 附带的 Erlang 包。也许这是一个已知的错误?

Is it (theoretically) possible that the process that's been spawn_monitor()'ed exits (with the normal exit or on error) without sending 'DOWN' message to the parent process ? I have a very strange process leakage, it seems like some of the processes do not send 'DOWN' message. I am using Erlang package that comes with Ubuntu 9.10. Maybe it is a known bug ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

转身以后 2024-09-03 08:45:25

您需要显示一些代码。监控是 erlang 工作方式的核心。

很难说出你的实际问题是什么,因为你没有描述你所看到的,所以我不得不猜测。

您要么没有尝试接收关闭消息,要么该进程没有退出。

如果您有进程泄漏,听起来它们实际上并没有退出。

您很可能正在尝试构建自己的supervisor 模块。如果您想要正常的进程树关闭和/或重新启动,我强烈建议使用 OTP 的主管。

You'll need to show some code. Monitoring is pretty core to the way erlang works.

It's hard to tell what your actual problem is since you're not describing what you're seeing, so I'll have to guess.

You're either not trying to receive the down message or the process isn't exiting.

If you have processes leaking, it sounds like they're not actually exiting.

You very well may be trying to build your own supervisor module. I'd strongly suggest using OTP's supervisor if you want sane process tree shutdown and/or restart.

疯到世界奔溃 2024-09-03 08:45:25

也许您在某个时候取消了该流程?

从 erlang:demonitor/1 的文档中读取:

一旦 erlang:demonitor(MonitorRef) 返回,就保证不会
{'DOWN', MonitorRef, _, _, _} 消息
由于显示器将被放置在
调用者消息队列中
未来。 A {'向下', MonitorRef, _, _,
_} 消息可能已在调用者消息队列中放置
不过,打电话吧。因此,在大多数
情况下,建议删除此类
消息中的“DOWN”消息
监控完成后排队
停了下来。 erlang:demonitor(MonitorRef,
[flush]) 可以用来代替
erlang:demonitor(MonitorRef) 如果这个
需要清理。

Maybe you demonitored the process at some point?

Reading from the doc for erlang:demonitor/1:

Once erlang:demonitor(MonitorRef) has returned it is guaranteed that no
{'DOWN', MonitorRef, _, _, _} message
due to the monitor will be placed in
the callers message queue in the
future. A {'DOWN', MonitorRef, _, _,
_} message might have been placed in the callers message queue prior to the
call, though. Therefore, in most
cases, it is advisable to remove such
a 'DOWN' message from the message
queue after monitoring has been
stopped. erlang:demonitor(MonitorRef,
[flush]) can be used instead of
erlang:demonitor(MonitorRef) if this
cleanup is wanted.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文