• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Perl AnyEvent中的watcher实例
    POST TIME:2021-10-18 15:07

    这几天看了下perl的事件编程框架AnyEvent,重点参考了一下几篇文章:

    http://search.cpan.org/~mlehmann/AnyEvent-7.05/lib/AnyEvent.pm

    http://search.cpan.org/~mlehmann/AnyEvent-7.05/lib/AnyEvent/Intro.pod

    https://www.jb51.net/article/55278.htm

    1、什么是事件编程?

    举个简单的例子,你浏览网页的时候,你点击一个图片,蹭的弹出一个东西,你不点,那就在那里,等待一个人来点它。如果你写过js,其实就是,你注册了很多的时间比如click,dbclick,keybord,submit等,那么浏览器就起到帮我们去监听这些事件的发生(Loop)。当有对应的事件发生的时候,我们也一般也设置了callback,比如onclick,onsubmit等,去响应这些事件,这基本就是事件编程的一个缩影了。

    2、perl AnyEvent中的watcher

    在AnyEvent中有5中watcher,分别是IO,timer,signal, child, idle.

    2.1 io watcher

    复制代码 代码如下:

    #!/usr/bin/perl
     
    use AnyEvent;
    my $cv = AnyEvent->condvar;
     
    #open my $file , '' , 'test.txt' or die "$!" ;
    open F , '' , 'test.txt' or die "$!" ;
    my $io_watcher = AnyEvent->io (
          fh   => *F,
          poll => 'r',
          cb   => sub {
             chomp (my $input = sysread F ,my $buf ,1024); # read a line
     
             warn "read: $buf\n"  if $input >0 ;       # output what has been read
             #$cv->send if /quit/ ; # quit program if /quit/i
          },
       );
     
    $cv->recv; # wait until user enters /quit/i

    timer watcher

    AnyEvent 的timer的一部分其实像javascript的setInterval :

    复制代码 代码如下:

    #!/usr/bin/perl
     
    use 5.016;
    use AnyEvent ;
     
    my $cv = AnyEvent->condvar ;
     
    my $w = AnyEvent->timer(
        after => 0 ,  #多少秒之后触发事件
        interval => 2 ,  #多少秒触发事件
        cb => sub {
            say AnyEvent->time ," ",AnyEvent->now ;
     
        }
    );
     
    $cv->recv;

    signal watcher

    前面我们在的文章中写到了perl中对于信号的处理 《perl信号处理简单学习》,这里主要是AnyEvent中对于这些事件的处理。

    复制代码 代码如下:

    #!/usr/bin/perl
     
    use 5.016;
    use AnyEvent ;
    #say for keys %SIG; 看一下又多少信号
    my $cv = AnyEvent->condvar ;
     
    my $w = AnyEvent->signal(
        signal => 'INT',
        cb => sub {
            say AnyEvent->time ," ",AnyEvent->now ;
            exit 1 ;
     
        }
    );
     
    $cv->recv;

    child watcher

    复制代码 代码如下:

    #!/usr/bin/perl
    use AnyEvent;
       my $done = AnyEvent->condvar;
     
       my $pid = fork or exit 5;
     
       my $w = AnyEvent->child (
          pid => $pid,
          cb  => sub {
             my ($pid, $status) = @_;
             warn "pid $pid exited with status $status";
             $done->send;
          },
       );
     
       # do something else, then wait for process exit
       $done->recv;

    idle watcher

    就是如果main loop在空闲的时候做些什么呢?

    复制代码 代码如下:

    #!/usr/bin/perl
    use AnyEvent;
       my @lines; # read data
       my $idle_w;
       $cv = AnyEvent->condvar;
       my $io_w = AnyEvent->io (fh => \*STDIN, poll => 'r', cb => sub {
          push @lines, scalar STDIN>;
     
          # start an idle watcher, if not already done
          $idle_w ||= AnyEvent->idle (cb => sub {
             # handle only one line, when there are lines left
             if (my $line = shift @lines) {
                print "handled when idle: $line";
             } else {
                # otherwise disable the idle watcher again
                undef $idle_w;
             }
          });
       });
     
       $cv->recv;

    您可能感兴趣的文章:
    • perl AnyEvent简单介绍和入门知识
    上一篇:perl AnyEvent简单介绍和入门知识
    下一篇:perl 采集入库脚本分享
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信