我对Perl中的这个Parallel::ForkManager模块很新,它有很多学分,所以我认为它支持我需要的东西,我还没想到。
我需要做的是在每个子进程中,根据每个子进程中计算的键值,将一些更新写入全局哈希映射。 但是,当我继续在for循环之外声明一个哈希映射并期望在循环之后更新哈希映射时,事实证明哈希映射保持为空。 这意味着虽然循环内部的更新成功(通过打印出值),但在循环外部则不然。
有人知道如何编写这样一段代码来实现我想要的吗?
答案 0 :(得分:6)
这不是Perl特定的问题,而是理解Unix风格的进程。当您fork
新进程时,进程之间默认不共享任何内存。根据您的需要,有几种方法可以达到您想要的效果。
一种简单的方法是使用BerkeleyDB之类的东西将哈希绑定到磁盘上的文件。绑定哈希可以在fork之前初始化,然后每个子进程都可以访问它。 BerkeleyDB文件旨在安全地同时从多个进程访问。
更复杂的方法是使用某种形式的进程间通信。有关实现此目的的所有细节,请参阅perlipc联机帮助页,其中详细介绍了Perl支持的几种IPC方法。
最后一种方法,如果你的Perl支持它,就是使用线程并在它们之间共享变量。
答案 1 :(得分:4)
每个fork
调用都会生成一个全新的进程,因此子进程中哈希变量的更新在父进程中不可见(fork
调用后对父进程的更改不可见孩子)。
您可以使用threads
(另请参阅threads::shared
)在一个线程中写入的更改可在另一个线程中写入。
另一种选择是使用进程间通信在父进程和子进程之间传递消息。 Forks::Super
模块(我是其中的作者)可以使这不那么令人头疼。
或者您的子进程可以将一些输出写入文件。当父进程收到它们时,它可以从这些文件加载数据并相应地更新其全局哈希映射。
答案 2 :(得分:2)
从man Parallel :: ForkManager中读取“从子进程中检索DATASTRUCTURES”部分。有回调,孩子的数据可以发送,父母可以检索它们并填充数据结构。