【发布时间】:2011-08-05 05:17:02
【问题描述】:
我一直在编写一个多次分叉的程序,每个分叉也可能分叉成更小的部分。
每个最低级别的孩子最终都在运行一个复杂的计算并将结果输出到一个唯一命名的文件中。
ID 必须是唯一的,这样当所有子代都完成后,父代可以收割子代,然后收集数据。
作为一个更具体的示例,每个孩子将生成一个文件$unique_id.storable,其中包含各自孩子已处理的数据。
当父级发现所有子级都已完成时,它使用 storable 将文件读回到哈希中,并使用希望唯一的 $unique_id 作为键。
当两个孩子几乎同时产生时,问题就出现了。现在,每个孩子最终都会运行自己的独立计数器,因此多个孩子都可以创建一个名称相似的$unique_id,即使这些文件中的数据确实是唯一的。
如何在分叉之间共享一个计数器变量,一个纯标量?
我意识到进程间通信的问题在互联网上相当普遍,但我注意到许多解决方案解决了进程之间共享任意数量数据的一般问题。我只需要共享一个标量,所以我想知道我的问题是否可以以更简单的方式处理。理想情况下,实际上非常理想,我更喜欢不涉及“非标准”模块的解决方案。我看到有时建议使用IPC::Shareable,但我想知道这对我的问题来说是否有点矫枉过正,无论如何,这是那些“非标准”模块之一。
如果我将我的$unique_id 设为 PID 是否明智?父程序是否有可能在一个使用率很高的机器上运行一个星期,可能会重用 PID 而不能保证唯一性?
如果有人可以提供任何建议,我将不胜感激。
【问题讨论】:
-
是的,所以发布的解决方案并没有直接解决我使用某种形式的 IPC 的愿望,但它们确实解决了我的问题,即我的 perl 程序的分支之间有一个唯一的计数器变量。
标签: perl ipc fork parent-child shared-memory