perl - 从一个脚本发送哈希到另一个脚本(子父级)

时间:2013-03-25 22:01:24

标签: json perl

我正在制作一个可以分拣孩子的脚本(一次只能一个)。子进程查询数据库,并应将返回的结果返回给父进程。从孩子到父母沟通的最佳方式是什么?目前我正在使用以下代码:

父:

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

#close READER;

孩子:

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

但是这个有时会失败,因为没有数据被发送而且父级已经死亡(JSON格式错误 - 没有数据存在格式错误!)

1 个答案:

答案 0 :(得分:2)

一些可能适用于您的解决方案的集合:

线程

进程间通信很痛苦。 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值一样。您的父母读取maybe-JSON,检查此特殊值,并解码JSON(如果未找到标记),或处理错误。空字符串将成为一个很好的标记。