使用 perl 的按需进程间通信
Posted
技术标签:
【中文标题】使用 perl 的按需进程间通信【英文标题】:On demand inter-process communication with perl 【发布时间】:2012-09-03 10:10:23 【问题描述】:想象一下进程间通信
+--------------+ +------------+
| main_process | ==produces data somewhat to=> | monitoring |
+--------------+ +------------+
地点:
main_process
不间断地运行并为monitoring
生成一些数据
monitoring
只是偶尔运行,当它运行时它应该读取main_process
产生的数据
当monitoring
未运行时,不应保存main_process
生成的数据。
问题是:如何写成“按需”IPC?
main_process
的代码基本上是下一个(真实的更复杂):
use 5.014;
use warnings;
my $box = new BlackBox( callback => sub
my ($self, $jref) = @_;
#
# processing of $jref
#
);
$box->run();
callback
每 2-5 秒被调用一次,正如我上面所说的,这个过程应该不间断地运行。我无法更改 BlackBox。
我需要:
写processing of $jref
部分 - 应该将$jref
发送到某处
和monitoring
进程本身,应该读取什么数据,什么时候运行......
不需要任何代码,只需要一些指向正确方向的指针,或者想法如何做到这一点,而不会填满我的内存或硬盘,所以最简单的方法:
将 $jref 写入文件是不适合,因为当monitoring
未运行时,它会填满我的硬盘。
如果有人关心,$jref
是对 json 字符串的引用,所以我可以这样做:
use JSON::XS qw(decode_json):
my $perlref = decode_json($$jref);
【问题讨论】:
【参考方案1】:我的第一个想法是“UDP 到 localhost?”
该想法的变体包括 AF_UNIX 或命名管道。使用流套接字,您将执行非阻塞连接,使用管道,您将执行 O_WRONLY|O_NONBLOCK,如果您得到 EAGAIN,则无需写入即可返回。
您可以保存您的文件句柄并在多次调用中重复使用它,如果您收到EPIPE
,只需将其关闭并重新打开。你会想要$SIGPIPE='IGNORE';
希望黑匣子不会反对。
阅读方面就像cat $path_to_fifo
或nc -l -u -p $udpport
一样简单,如果你做一个AF_UNIX 套接字会稍微难一些。
【讨论】:
根据您(和@perreal)的建议,我刚刚找到了search.cpan.org/~robins/Log-UDP-Client-0.20.0/lib/Log/UDP/… 和search.cpan.org/~robins/Log-UDP-Server-0.40.0/lib/Log/UDP/…,这给了我一个非常简单的解决方案。谢谢你。因为 "UDP" 接受这个。 ;)【参考方案2】:听起来使用套接字就足够了。选择一个端口号P
并尝试从主应用程序(localhost:P
)连接到监视器。如果端口打开,则发送实际数据,而不是参考。如果端口关闭,则忽略数据。您的监视器将侦听 P
并处理通过此端口接收到的任何数据。
【讨论】:
以上是关于使用 perl 的按需进程间通信的主要内容,如果未能解决你的问题,请参考以下文章