【问题标题】:How can I spawn multiple processes concurrently from Supervisor?如何从主管同时生成多个进程?
【发布时间】:2019-09-06 12:42:54
【问题描述】:

我一直在尝试通过更改参数和 id 从我的 Supervisor 模块启动同一模块的多个进程。但是,我看到子进程是按顺序生成的。

当使用 spawn 或 spawn 链接时,它可以正常工作,但是我没有调用 worker 方法,并且不会监督进程。 Supervisor 模块中是否还有其他方法可以同时执行此操作?

【问题讨论】:

  • 没有。 Elixir(和 Erlang)代码按顺序运行。如果主管要同时启动其子进程,则需要启动其他进程才能启动您的工作人员。 BEAM 上的进程很便宜,但我确信启动你的GenServer(或任何行为)仍然比启动进程更快,只是为了启动其他进程。您还必须考虑不同的重启策略。例如,rest_for_one 策略用于当您的进程需要以特定顺序启动(和重新启动)时。所以在这种情况下并发实际上是有害的
  • 在浏览文档时,我发现所有的行为模块都是对裸进程的抽象。现在可以使用spawn 并行生成裸进程,但GenServer 中的start_link 方法是顺序的。我想知道为什么没有方法可以并行启动进程。
  • "是否有在 Supervisor 模块中允许同时执行此操作的任何其他方法?" - 你的问题是问你是否可以。不是为什么你不能。为什么你不能这样做的答案是因为主管调用start_link,以便它有一个指向进程的链接,所以它知道它何时崩溃并相应地重新启动。如果它没有与流程的链接,它就不会监督它。

标签: elixir


【解决方案1】:

当使用Kernel.spawn/3Kernel.spawn_link/3 时,它可以正常工作,但是我没有调用worker 方法,并且不会监督进程。

这里有很多问题。首先, 中没有方法,我们有函数。 Supervisor.Spec.worker/3弃用,不应使用。应该改用child specifications

当然,您可以在 Process.monitor/1 的帮助下监督已启动的进程(这里是核心 DynamicSypervisor does that 的示例),但这不是你实际的想做。

重初始化应该放在你的工人的GenServer.handle_continue/2回调中。这样它将在进程中执行,并且您的初始化将立即返回;实际上它会有点“并发”加载,但进程仍然会按顺序排序,从而更容易处理。

【讨论】:

  • 这真的很有帮助。谢谢
猜你喜欢
  • 2012-01-10
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-26
  • 2018-09-03
相关资源
最近更新 更多