【问题标题】:Using Erlang to spawn multiple external processes使用 Erlang 生成多个外部进程
【发布时间】:2011-01-16 21:59:20
【问题描述】:

当我穿越 Erlang 的美妙世界时,我注意到了它的美丽,但更重要的是,我注意到了它的速度。这让我想知道,既然 Erlang 非常擅长生成轻量级进程,那么将它用作其他进程的包装器是否有意义。

例如,我使用rspec 为 ruby​​ 编写测试。假设我有 10,000 个测试,所有测试都可以毫无问题地独立运行。使用 Erlang 生成 10,000 个 rspec 并同时运行每个测试而不是 rspec 按顺序运行每个测试是否有意义?或者这只是一个完全荒谬的想法?

【问题讨论】:

    标签: process erlang performance wrapper


    【解决方案1】:

    您将 erlang 进程与 OS 进程混淆了。 erlang VM 在 OS 进程中运行,解释和运行 erlang 程序(编译在梁文件中)。当 erlang 程序调用 spawnspawn_link 时,VM 会创建一个内部进程,该进程将由内部 VM 调度程序运行。操作系统对这些进程一无所知。

    但是,当 erlang 程序生成一个端口(在您的情况下运行外部程序的常用方法,如 ruby​​ 解释器)时,它会在 VM 外部创建一个新的 OS 进程。该外部进程使用标准输入输出与 VM 通信。如果您查看系统中的进程,您会注意到有一个 beam 进程(erlang VM)和一个 ruby​​ 进程。

    因此,从 erlang VM 启动 OS 进程与通过任何其他方式(手动、在 shell 脚本等)启动它们相比没有任何区别

    【讨论】:

    • 如果@elmt 有这 10000 个测试用 Erlang 代码编写,并且可以在不涉及任何其他操作系统进程的情况下将它们作为 Erlang 进程运行,那么会有什么不同。
    • 是的。但在这种情况下,由于@elmt 想要测试 ruby​​,这是不可能的。
    • 有道理。我为我的无知道歉,我现在只是在 erlang 中弄湿了我的脚。
    【解决方案2】:

    我猜 rspecs 是重量级进程,在这种情况下,其中 10,000 个会使任何操作系统都崩溃,即使它们被“包裹”在 Erlang 进程中。 Erlang 的进程在操作系统意义上不是真正的进程,它们不能用它们的“神奇”属性来灌输普通的操作系统进程。他们只是要求操作系统生成该进程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      • 2012-01-10
      • 2018-03-04
      • 1970-01-01
      • 2018-09-03
      • 2017-08-07
      • 1970-01-01
      相关资源
      最近更新 更多