Perl AnyEvent中的watcher实例

这几天看了下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

http://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;

(0)

相关推荐

  • perl AnyEvent简单介绍和入门知识

    什么是面向事件的编程(事件驱动的编程): 编程中所有的程序是由事件决定 – 可以是由用户操作(键盘,鼠标),也可以是由其他程序和流的到达或者操作系统事件(如网络数据包到达)来触发执行. 面向事件编程可以也被定义为,写一个计算机程序,在其中的代码(通常程序的功能的头部)被明确分配应用程序的主回路,其代码本身由两部分组成方法:事件和事件处理的代码. 面向事件的编程通常被应用在三种情况下: 1.创建用户界面的控制(包括图形) 2.创建一个基于服务器的应用程序 3.游戏编程时多个对象的管理 我们系统管理

  • Perl AnyEvent中的watcher实例

    这几天看了下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 http://www.jb51.net/article/55278.htm 1.什么是事件编程? 举个简单的例子,你浏览网页的时候,你点击一个图片,蹭的弹出

  • Perl语法中Perl运算符用法指南

    Perl语法 Perl运算符简介 1.Perl运算符 1.1 算数运算符 Perl固然在变量与数据范例都和C大不不异,然而它的运算符和C险些不异,除了C的范例转换运算符type,指针引用运算符*ptr和布局成员选择符,其他C的运算符险些完全呈现在Perl里,Perl新增了几个新运算符,好比在字符处置方面. ◆Perl到今朝撑持的算数运算符有一些几种: +加法运算符-减法运算符*乘运算符/除运算符(只对浮点数运算)%取模运算符(只对整数运算) 下面给出Perl算数运算的一些实例: $x=2.5;$

  • 浅谈 vue 中的 watcher

    观察 Watchers 虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的 watcher .这是为什么 Vue 提供一个更通用的方法通过watch 选项,来响应数据的变化.当你想要在数据变化响应时,执行异步操作或开销较大的操作,这是很有用的. 大家对于 watch 应该不陌生,项目中都用过下面这种写法: watch: { someProp () { // do something } } // 或者 watch: { someProp: { deep: true, handler ()

  • Angularjs中数据绑定的实例详解

    Angularjs中数据绑定的实例详解 这是一个最简单的angularjs的例子,关于数据绑定的,大家可以执行一下,看看效果 <html ng-app> <head> <title>angularjs-include</title> <script type="text/javascript" src="js/angular/angular.min.js"></script> </head

  • angular ng-repeat数组中的数组实例

    //先定义一个数组 anular代码: var app = angular.module('serApp', []); app.controller('indexCtrl', function($scope, $http) { $scope.arrs = [{ <BR> n:'a': arr:['1','2','1'] },{<BR><BR> n:'b': arr:['4','5','6'] }]; }) html 代码: <BR> <div ng-c

  • C++ 中构造函数的实例详解

    C++ 中构造函数的实例详解 c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初学者有所帮助. 1. 构造函数是干什么的 class Counter { public: // 类Counter的构造函数 // 特点:以类名作为函数名,无返回类型 Counter() { m_value = 0; } private: // 数据成员 int m_va

  • JSP Spring配置文件中传值的实例详解

    JSP Spring配置文件中传值的实例详解 通过spring提供方法,在配置文件中取传值 调用get方法  targetObject :指定调用的对象       propertyPath:指定调用那个getter方法 例1: public class Test1 { private String name = "nihao"; public String getName() { return name; } } Xml代码 <bean id="t1" cl

  • 浅析JS获取url中的参数实例代码

    js获取url中的参数代码如下所示,代码简单易懂,附有注释,写的不好还请见谅! function UrlSearch() { var name, value; var str = location.href; //取得整个地址栏 var num = str.indexOf("?") str = str.substr(num + 1); //取得所有参数 stringvar.substr(start [, length ] var arr = str.split("&&

  • Angularjs 1.3 中的$parse实例代码

    这次我们来看一下angular的Sandboxing Angular Expressions.关于内置方法的,核心有两块:Lexer和Parser.其中大家对$parse可能更了解一点.好了不多废话,先看Lexer的内部结构: 1.Lexer //构造函数 var Lexer = function(options) { this.options = options; }; //原型 Lexer.prototype = { constructor: Lexer, lex: function(){}

随机推荐