当前位置 主页 > 服务器问题 > win服务器问题汇总 >
什么是面向事件的编程(事件驱动的编程):
编程中所有的程序是由事件决定 – 可以是由用户操作(键盘,鼠标),也可以是由其他程序和流的到达或者操作系统事件(如网络数据包到达)来触发执行.
面向事件编程可以也被定义为,写一个计算机程序,在其中的代码(通常程序的功能的头部)被明确分配应用程序的主回路,其代码本身由两部分组成方法:事件和事件处理的代码。
面向事件的编程通常被应用在三种情况下:
1.创建用户界面的控制(包括图形)
2.创建一个基于服务器的应用程序
3.游戏编程时多个对象的管理
我们系统管理时,这种应用在服务器的应用程序中使用面向事件的编程很多,比如用于服务器应用解决10,000个并发连接(所谓 C10k 问题)
AnyEvent 是一个性能非常好的基于事件驱动的程序,有人使用它来解决 C10k 的问题,象平时我们写的程序,都是基于过程.我们都是先做完事件1-> 然后做事件2->然后做事件3 .这种方式.
但基于事件就完全不一样了,在主流程中你基本只有一个主体框架,程序的动作触发都是由事件来驱动.比如我们使用的窗口程序.点最大化最小化,都是基于事件,当接收到了最大化的事件做最大化事件那部分的程序开始运行.不在从头到尾部来执行.所以我们读基于事件的程序,最好是画成思维导图来帮助我们理解.
基于事件的程序常用到的最大好处是用来做异步,例如,我们要下载 100 个文件,下载完后对这些文件进行处理.可能给每个下载和处理的过程写成事件,这些事件可以同步运行(关键在于网络连接和进行文件的读写 IO 时要等待,事件是给这些等待复用起来).
不知大家了解 Perl 中的 select 这个功能不,就是等到句柄可以读或者写的时候,做不同的读或者写的操作.事件循环也是一样.
在整个 AnyEvent 入门中,我们只要关注二个点就行, WATCHERS(监控者) 和 条件变量.
WATCHERS(监控者)
在 select 中,有个角色叫"监控者",就是 select 函数本身.
在 AnyEvent 中不但可以监控 IO 还可以监控别的一些事件.来做不同的处理.我们可以看成这是不断的盯着某件事情的人
有如下几个基本的内置的可以用来盯着的事情("监控者").
TIMER : 监控时间,到了一定的条件,然后对不同的时间做不同的事件
I/O: 这个是监控到 IO 是否可以读写,然后做相应的事件
IDLE: 空闲时做什么事件
SIGNAL : 监控观查到不同的信息,调用相应的事件
CHILD PROCESS: 对子程序的状态来调用相应的处理事件
TIMER WATCHERS
基本语法
复制代码 代码如下:
AnyEvent->timer(
after => $seconds, # 多久之后做相应的操作.
interval => $seconds, # 在上面条件生效后,每格多久进行一次 callback.
cb => $cb, # cb 是 callback 的简写,所以知道了吧,只要到了前面的条件,就会运行 cb => 指向的函数.
);
使用实例:
下面的例子是,5 秒后,每 2 秒进行一次 callback 中的事件,直到 $w 这个注册的事件被 undef 为止(也就是 $count > 10 次).这个中的 undef $w 是取消掉这种 watcher 的方法.
复制代码 代码如下:
#!/usr/bin/perl
use strict;
use AnyEvent;
my $cv = AnyEvent->condvar;
my $count = 0;
my $w; $w = AnyEvent->timer(
after => 5,
interval => 2,
cb => sub {
$count++;
warn "这是第 $count 次调用";
if ($count >= 10) {
undef $w;
}
}
);
$cv->recv;