事件驱动:
编程中所有的程序是由事件决定 – 可以是由用户操作(键盘,鼠标),也可以是由其他程序和流的到达或者操作系统事件(如网络数据包到达)来触发执行.
基于事件的程序常用到的最大好处是用来做异步,例如我们要下载 100 个文件,下载完后对这些文件进行处理.可能给每个下载和处理的过程写成事件,这些事件可以同步运行(关键在于网络连接和进行文件的读写 IO 时要等待,事件是给这些等待复用起来).
WATCHERS(监控者)
在 select 中,有个角色叫"监控者",就是 select 函数本身.
在 AnyEvent 中不但可以监控 IO 还可以监控别的一些事件.来做不同的处理.我们可以看成这是不断的盯着某件事情的人
有如下几个基本的内置的可以用来盯着的事情("监控者").
TIMER : 监控时间,到了一定的条件,然后对不同的时间做不同的事件
I/O: 这个是监控到 IO 是否可以读写,然后做相应的事件
IDLE: 空闲时做什么事件
SIGNAL : 监控观查到不同的信息,调用相应的事件
CHILD PROCESS: 对子程序的状态来调用相应的处理事件
各种WATCHERS(监控者)示例
TIMER WATCHERS
基本语法
AnyEvent->timer(
after => $seconds, # 多久之后做相应的操作.
interval => $seconds, # 在上面条件生效后,每格多久进行一次 callback.
cb => $cb, # cb 是 callback 的简写,所以知道了吧,只要到了前面的条件,就会运行 cb => 指向的函数.
);
使用实例
下面的例子是,5 秒后,每 2 秒进行一次 callback 中的事件,直到 $w 这个注册的事件被 undef 为止(也就是 $count > 10 次).这个中的 undef $w 是取消掉这种 watcher 的方法.
node1:/tmp#cat a1.pl
use AnyEvent;
my $cv = AnyEvent->condvar;
my $count = 0;
my $w; $w = AnyEvent->timer(
after => 5,
interval => 2,
cb => sub {
print "$count===$count
";
$count++;
warn "这是第 $count 次调用";
if ($count >= 10) {undef $w;}
}
);
$cv->recv;
node1:/tmp#perl a1.pl
$count===0
这是第 1 次调用 at a1.pl line 10.
$count===1
这是第 2 次调用 at a1.pl line 10.
$count===2
这是第 3 次调用 at a1.pl line 10.
$count===3
这是第 4 次调用 at a1.pl line 10.
$count===4
这是第 5 次调用 at a1.pl line 10.
$count===5
这是第 6 次调用 at a1.pl line 10.
$count===6
这是第 7 次调用 at a1.pl line 10.
$count===7
这是第 8 次调用 at a1.pl line 10.
$count===8
这是第 9 次调用 at a1.pl line 10.
$count===9
这是第 10 次调用 at a1.pl line 10.
onclick事件
use Tk;
use strict;
use DBI;
# Main Window
my $mw = new MainWindow;
my $but1 = $mw -> Button(-text => "view cpu",-width=>80,
-command =>&push_button);
$but1 -> pack();
my $but2 = $mw -> Button(-text => "view memory",-width=>80);
$but2 -> pack();
my $but3 = $mw -> Button(-text => "view disk",-width=>80);
$but3 -> pack();
my $but3 = $mw -> Button(-text => "view Event",-width=>80);
$but3 -> pack();
MainLoop;
#This is executed when the button is pressed
sub push_button {
print 'aaaaaaaaaaaaaa';
}