【问题标题】:perl -- send hash from one script to another one (Child parent)perl -- 将哈希从一个脚本发送到另一个脚本(子父级)
【发布时间】:2013-03-26 06:42:13
【问题描述】:

我正在编写一个分叉一个孩子的脚本(一次只有一个)。子查询数据库并应将散列中的结果返回给父。孩子与父母沟通的最佳方式是什么?目前我正在使用以下代码:

家长:

                  close WRITER;
              chomp(my $line = <READER>);
              logEntry("Parent Pid $$ received panelist listing.");
              print '-------------------------';
              print $line ; 
              print '-------------------------';
              %cached_panelists_hash = %{ decode_json $line };

#关闭阅读器;

孩子:

    my $json = encode_json \%cached_panelists_hash;
    close READER;
    print WRITER $json;
    close WRITER;  # this will happen anyway

但是这个失败有时,因为没有数据被发送并且父节点死亡(JSON 格式错误 - 没有数据格式错误!)

【问题讨论】:

  • 请分享完整代码,包括孩子对数据库的访问。另外,在子级和父级中使用相同的 var %cached_panelists_hash 会造成混淆,我建议以不同的方式命名它们。
  • Storable module 是一个选项。
  • 我使用相同变量的原因是孩子应该使用其中的数据。

标签: json perl


【解决方案1】:

一些可能适合或不适合您的解决方案的集合:

线程

进程间通信很痛苦。 Perl 支持线程(尽管线程实现也很痛苦)。它允许您将变量标记为共享,这在这里可能很有用。但是线程也可以返回值:

use threads;

my $query_db_thread = threads->create(\&query_db);

...; # do other stuff at the same time.

my $results = $query_db_thread->join();

sub query_db { ... } # normal sub that returns your data.

Perl 线程的语义类似于分叉,即线程使用看起来像同一个变量的单独副本(除非明确共享)。

使用函数式编程原则可以使您的程序更容易线程化。

可存储模块

您还可以使用例如序列化您的数据。 Storable 模块。该文档有一些很好的示例,涵盖了打包和解包。简而言之:

use Storable qw/freeze thaw/;

# In child:
print PARENT freeze(\%data);

# in parent:
local $/; binmode CHILD;
my $data = thaw(<CHILD>);

Storable 比 JSON “更好”,因为 JSON 不能传输所有 Perl 数据结构,如对象。

最简单的解决方案。

如果您的孩子不想返回结果,并且想将其传达给父​​母,则可以通过多种方式发出信号。就像返回一个非 JSON 值一样。您的父母读取可能的 JSON,检查此特殊值,然后解码 JSON(如果未找到标记)或处理错误。空字符串将成为一个很好的标记。

【讨论】:

    猜你喜欢
    • 2016-08-22
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    相关资源
    最近更新 更多