我正在制作一个可以分拣孩子的脚本(一次只能一个)。子进程查询数据库,并应将返回的结果返回给父进程。从孩子到父母沟通的最佳方式是什么?目前我正在使用以下代码:
父:
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格式错误 - 没有数据存在格式错误!)
答案 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(如果未找到标记),或处理错误。空字符串将成为一个很好的标记。