【发布时间】:2021-09-24 13:54:38
【问题描述】:
假设您有一个 OTP 进程,您希望同步等待其完成(其中“完成”可能是正常退出或崩溃、停止等)。
进一步假设出于业务原因,您不能使用 Task.async/1 或相关的 Task 实用程序生成此进程 - 它必须是不依赖于 Task.await/2 的“正常”进程。
除了间歇性地轮询Process.alive?/1,还有更好的方法吗?这让我印象深刻,因为它可能有一个既定的模式,但对于我的生活,我找不到它。
def await(pid, timeout) when timeout <= 0 do
if Process.alive?(pid) do
Process.exit(pid, :kill) # (or however you want to handle timeouts)
end
end
@await_sleep_ms 500
def await(pid, timeout) do
# Is there a better way to do this?
if Process.alive?(pid) do
:timer.sleep(@await_sleep_ms)
await(pid, subtract_timeout(timeout, @await_sleep_ms))
end
end
【问题讨论】:
-
你知道进程是否正在捕获退出吗?在任何情况下,
Process.monitor/1和receive/1在消息处理程序中使用timeout: :infinity和模式匹配 PID 是一种可行的方法。 -
啊哈!
Process.monitor/1正是我想要的!
标签: elixir erlang-otp