代码之家  ›  专栏  ›  技术社区  ›  galactica

Parallel::ForkManager()模块是否支持全局变量的同步?

  •  8
  • galactica  · 技术社区  · 15 年前

    Parallel::ForkManager 模块,它有很多学分,所以我认为它支持我需要的东西,我只是还没有弄清楚。

    我需要做的是在每个子进程中,它根据每个子进程中计算的键值将一些更新写入全局哈希映射。 但是,当我继续在for循环之外声明一个哈希映射,并期望哈希映射在循环之后更新时,结果发现哈希映射保持为空。 这意味着,尽管循环内的更新成功(通过打印出值),但循环外的更新并不成功。

    3 回复  |  直到 13 年前
        1
  •  6
  •   Ether    15 年前

    这实际上不是一个特定于Perl的问题,而是一个理解Unix风格进程的问题。当你 fork

    一个简单的方法就是使用 BerkeleyDB 将散列绑定到磁盘上的文件。绑定哈希可以在分叉之前初始化,然后每个子进程都可以访问它。BerkeleyDB文件被设计成可以安全地从多个进程同时访问。

    perlipc manpage,其中详细介绍了Perl支持的几个IPC方法。

        2
  •  4
  •   mob    15 年前

    每个 fork 调用生成一个全新的进程,因此子进程中哈希变量的更新在父进程中不可见(并且在

    你可以用 threads (另请参见 threads::shared

    另一种选择是使用进程间通信在父进程和子进程之间传递消息。这个 Forks::Super 模块(我是其中的作者)可以使这一点不那么头痛。

    或者您的子进程可以将一些输出写入文件。当父进程获取它们时,它可以从这些文件中加载数据并相应地更新其全局哈希映射。

        3
  •  2
  •   psena    13 年前

    请阅读man Parallel::ForkManager中的“从子进程检索数据结构”部分。有回调,子数据可以发送,父数据可以检索它们并填充数据结构。