【问题标题】:Does Parallel::ForkManager() module support synchronization on global variables?Parallel::ForkManager() 模块是否支持全局变量同步?
【发布时间】:2011-01-18 14:41:42
【问题描述】:

我对 Perl 中的这个 Parallel::ForkManager 模块非常陌生,它有很多功劳,所以我认为它支持我需要的东西,但我还没有弄清楚。

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

有人知道如何编写这样一段代码来满足我的要求吗?

【问题讨论】:

    标签: perl multithreading ipc parallel-processing fork


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这实际上不是 Perl 特有的问题,而是理解 Unix 风格进程的问题。当您fork 一个新进程时,默认情况下进程之间不会共享任何内存。有几种方法可以实现您想要的,具体取决于您的需要。

      一种简单的方法是使用BerkeleyDB 之类的东西将哈希绑定到磁盘上的文件。绑定的哈希可以在你分叉之前初始化,然后每个子进程都可以访问它。 BerkeleyDB 文件旨在安全地同时从多个进程访问。

      更复杂的方法是使用某种形式的进程间通信。有关实现这一点的所有详细信息,请参阅 perlipc 手册页,其中详细介绍了 Perl 支持的几种 IPC 方法。

      如果您的 Perl 支持,最后一种方法是使用线程并在它们之间共享变量。

      【讨论】:

        【解决方案3】:

        每个fork 调用都会生成一个全新的进程,因此子进程中哈希变量的更新在父进程中不可见(并且在fork 调用之后对父进程的更改在子进程中不可见)。

        您可以使用threads(另请参阅threads::shared)将一个线程中写入的更改写入另一个线程。

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

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

        【讨论】:

        • 谢谢大家,现在我明白了!我期待 ForkManager() 处理这个问题。 :-) 就我而言,IPC 可能是矫枉过正。我喜欢使用 ForkManager() 的简洁方式,那么有没有一种简单的方法可以使用 ForkManager() 在进程之间共享全局哈希映射?
        • @Jin:从一个进程获取数据到另一个 IPC。这就是它的意思。不过,这并不难。
        • @Jin:是的,使用绑定哈希;一个见search.cpan.org/perldoc/BerkeleyDB
        猜你喜欢
        • 2018-12-09
        • 2016-08-05
        • 2016-02-10
        • 2015-03-07
        • 2017-04-19
        • 1970-01-01
        • 2017-06-12
        • 1970-01-01
        • 2016-10-20
        相关资源
        最近更新 更多