perl – 如何在写信给孩子时阻止父母阻止?

perl – 如何在写信给孩子时阻止父母阻止?,第1张

概述最近,当我想在两个进程之间进行通信时,我遇到了使用(pipe | – )的问题. 基本上,子进程无法像父进程一样快地处理STDIN.这导致父级等待STDIN空闲并使其运行缓慢. STDIN有多大,可以修改它.如果是,最佳练习大小是多少? 这是一些代码示例,以显示我的意思: if ($child_pid = open($child, "|-")){ $child->autoflush(1) 最近,当我想在两个进程之间进行通信时,我遇到了使用(pipe | – )的问题.
基本上,子进程无法像父进程一样快地处理STDIN.这导致父级等待STDIN空闲并使其运行缓慢.

STDIN有多大,可以修改它.如果是,最佳练习大小是多少?

这是一些代码示例,以显示我的意思:

if ($child_pID = open($child,"|-")){    $child->autoflush(1);    # PARENT process    while (1)    {             # Read packet from socket save in $packet             process_packet($packet);             # forward packet to child             print $child $packet;     }}else{     dIE "Cannot fork: $!" unless defined $child_pID;     # CHILD process     my $line;       while($line = <STDIN>)     {         chomp $line;         another_process_packet($line);     }}

在此示例中,another_process_packet比process_packet慢.我写这样的代码的原因是,我想使用相同的数据来自套接字并实际获得它一次.

提前致谢.

解决方法 您当然可以在父进程中进行缓冲,并且只在子进程fd可写时才写入子进程(即写入不会阻塞).您可以使用正确的参数进行syswrite,或使用事件循环:

use AnyEvent;use AnyEvent::Handle;# make child,assume you write to it via $fhmy $done = AnyEvent->condvar;my $h = AnyEvent::Handle->new( fh => $fh );while( you do stuff ){    my $data = ...;    $h->push_write($data); # this will never block}$h->on_drain(sub { $done->send });$done->wait; # Now you block,waiting for all writes to actually complete

编辑:这曾经是未经测试,但我测试了它,它的工作原理. (我使用了perl -ne“sleep 1; print $_”作为慢子.)如果可能的话,在while循环期间写入,但永远不会阻止循环.最后,您实际上会阻塞,直到所有写入完成.

我的测试脚本在gist.github:http://gist.github.com/126488上

您可以看到子如何阻止阻塞循环,但它如何阻止非阻塞循环.当你这样说时明显;)

(最后,作为一般经验法则;如果您正在与网络或其他进程交互,您应该使用事件循环.)

总结

以上是内存溢出为你收集整理的perl – 如何在写信给孩子时阻止父母阻止?全部内容,希望文章能够帮你解决perl – 如何在写信给孩子时阻止父母阻止?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1213446.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存