0

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

家长:

                  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格式错误-没有数据格式错误!)

4

1 回答 1

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 值一样。您的父母读取可能的 JSON,检查此特殊值,然后解码 JSON(如果未找到标记)或处理错误。空字符串将成为一个很好的标记。

于 2013-03-25T22:42:13.520 回答