【发布时间】: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