【问题标题】:One variable shared across all forked instances?一个变量在所有分叉实例之间共享?
【发布时间】:2013-09-26 02:46:49
【问题描述】:

我有一个 Perl 脚本,它反复分叉自己。我希望收集有关每个分叉实例的统计信息:它是通过还是失败以及总共有多少个实例。对于这个任务,有没有办法创建一个在所有实例之间共享的变量?

我的 perl 版本是 v5.8.8。

【问题讨论】:

  • 您可以使用waitpid 并检查退出代码吗?
  • 获取退出代码很简单,但如何保留它们呢?我有很多分叉的脚本,每个孩子分叉任意次数。
  • @mpapec 这很有趣。谁能给我举个例子?
  • 其实perldoc.perl.org/… 更适合分叉

标签: linux perl unix fork


【解决方案1】:

您应该以某种形式或形式使用 IPC,最常见的是共享内存段,带有信号量保护对其的访问。或者,您可以使用某种混合内存/磁盘数据库,其中访问 API 将为您处理并发访问,但这可能是一种矫枉过正。最后,您可以使用带有记录锁定的文件。

【讨论】:

    【解决方案2】:

    IPC::Shareable 做你真正要求的。每个进程都必须小心锁定和解锁共享哈希(例如),但数据似乎是跨进程共享的。

    但是,普通的 UNIX 工具提供了更简单的方法 (恕我直言) 来收集工人状态和计数。例如,让每个进程在 END{} 结束时写入 ($| = 1)“ok\n”或“not ok\n”,并确保它们正在写入 FIFO,因为相对较短的写入不会被交错。然后捕获该输出(例如,./my-script.pl | tee /tmp/my.log),您就完成了。另一种方法是让他们将他们的状态记录在一个简单的文件中——open(my $status, '>', "./status.$$")——在一个专门为此准备的目录中。

    【讨论】:

      猜你喜欢
      • 2020-07-17
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多