如何在Perl中的分叉之间共享简单的标量计数器变量?

问题描述

| 我已经编写了一个可以多次分叉的程序,每个分叉也可能分叉成较小的部分。 每个最低级别的子级最终都将运行复杂的计算并将结果输出一个我唯一希望的文件中,我希望该文件是唯一的。 这些ID必须是唯一的,以便当所有子代都完成后,父代可以收获子代,然后收集数据。 作为帮助具体化的示例,每个子代将产生一个文件“ 0”,其中包含各个子代已处理的数据。 当父级发现所有子级都已完成时,它将使用可存储的方式将文件读回散列,并使用唯一的ѭ1作为密钥。 当两个孩子几乎同时产卵时,就会出现问题。现在,这些子项中的每一个最终都将运行其自己的独立计数器,这样,即使这些文件中的数据确实是唯一的,多个子项也可能都创建一个类似的名称“ѭ1”。 如何在分叉之间共享一个仅标量的计数器变量? 我意识到进程间通信的问题在互连网上相当普遍,但是我注意到许多解决方案都解决了在进程之间共享任意数量的数据这一普遍问题。我只需要共享一个标量,所以我想知道我的问题是否可以更简单地处理。理想情况下,非常理想的情况下,我更喜欢不涉及“非标准”模块的解决方案。我看到有时建议使用“ 3”,但是我想知道这是否对我的问题来说是过大的了,无论如何,这是“非标准”模块之一。 如果我将“ 1”作为PID,是否明智?例如,在使用频繁的计算机上运行一个星期(例如一个星期)的父程序是否有可能重用PID而不能保证唯一性? 我希望人们能提供任何建议。     

解决方法

为什么不把身份证号码传下来?根进程产生
1
2
...
这些反过来产生
1.1
1.2
...

2.1
2.2
...

...
等等。     ,我可能会使用稍微不同的方法:您可以通过文件名来处理所有内容... 就唯一的PID而言,是的,大约一周后,您的PID可能会回收,从而不能保证它们是唯一的。但是,您可以将日期/时间附加到文件名中以确保唯一性。 要允许父级跟踪需要收集的所有结果文件,您可以简单地在父级中生成唯一的作业ID,然后在子级树中保持该常数不变。您可以将此作业ID用作结果文件的前缀,因此最终,父级仅读取具有适当前缀的所有文件。 文件名最终看起来有点麻烦,但它们只是临时文件,对吗? 结果文件名看起来像:
<job_id>_<pid>_<created_time>.storable
然后,父级只查找所有文件
<job_id>_*.storable
    ,您可以使用pid并确信它是唯一的,方法是让父级仅在父级处理完孩子的输出后才收获孩子。
# Wait for a child to terminate,but don\'t reap it yet.
my $pid = waitpid(-1,WNOWAIT);

# Collect data from the file for child $pid
...

# Reap the child.
waitpid($pid,0);  
但是在我看来,如果可以这样做,则可以使用管道进行通信,而不是使用临时文件。