perlanyevent简单介绍和入门知识_第1页
perlanyevent简单介绍和入门知识_第2页
perlanyevent简单介绍和入门知识_第3页
perlanyevent简单介绍和入门知识_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、 问题 ),比如用于服anyevent 是一个性能非常好的基于事件驱动的程序象平时我们写的程序,都是基于过程.我们都是先做完事件事件 3 .这种方式 .,有人使用它来解决1->然后做事件c10k 的问题 ,2-> 然后做但基于事件就完全不一样了 ,在主流程中你基本只有一个主体框架 ,程序的动作触发都是由事件来驱动 . 比如我们使用的窗口程序 .点最大化最小化 ,都是基于事件 ,当接收到了最大化的事件做最大化事件那部分的程序开始运行.不在从头到尾部来执行.所以我们读基于事件的程序 ,最好是画成思维导图来帮助我们理解.基于事件的程序常用到的最大好处是用来做异步,例如 ,

3、我们要下载100 个文件 ,下载完后对这些文件进行处理.可能给每个下载和处理的过程写成事件,这些事件可以同步运行( 关键在于网络连接和进行文件的读写io 时要等待,事件是给这些等待复用起来).不知大家了解perl 中的select 这个功能不,就是等到句柄可以读或者写的时候,做不同的读或者写的操作.事件循环也是一样.在整个anyevent 入门中 ,我们只要关注二个点就行, watchers( 监控者 ) 和 条件变量 .watchers(监控者 )在 select 中,有个角色叫监控者 ,就是 select 函数本身 .在 anyevent 中不但可以监控io 还可以监控别的一些事件看成这是

4、不断的盯着某件事情的人有如下几个基本的内置的可以用来盯着的事情(监控者 ).来做不同的处理.我们可以timer : 监控时间 ,到了一定的条件 ,然后对不同的时间做不同的事件 i/o : 这个是监控到 io 是否可以读写 ,然后做相应的事件idle : 空闲时做什么事件signal : 监控观查到不同的信息,调用相应的事件child process: 对子程序的状态来调用相应的处理事件timer watchers基本语法代码如下 :anyevent->timer(after => $seconds, #多久之后做相应的操作.interval => $s

5、econds, #在上面条件生效后,每格多久进行一次callback.cb => $cb, # cb是 callback 的简写 ,所以知道了吧,只要到了前面的条件,就会运行cb=>指向的函数 .);使用实例 :下面的例子是 ,5 秒后 , 每 2 秒进行一次 callback 中的事件 , 直到 $w 这个注册的事件被 undef 为止 (也就是 $count > 10 次 ).这个中的 undef $w 是取消掉这种 watcher 的方法.代码如下 :#!/usr/bin/perluse strict;use anyevent;my $cv =

6、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;i/o watchers基本语法代码如下 :my $fh = .; #打开一个句柄my $io; $io = anyevent->io(fh => $

7、fh, #上面打开的句柄,也可以是标准输入和输出poll => w, #这个地方可以选择r 和 w 来表示读和写的cb => sub syswrite( $fh,写入的内容);undef $io;);io事件使用实例 :下面的例子 ,是使用io字节 ,直到读完这个文件就通过监控到可以读, 就调用undef 消掉这个事件cb.的函数,直接读文件test.txt, 每次一个代码如下:#!/usr/bin/perluse strict;use anyevent;my $cv = anyevent->condvar;open my $fh, <t

8、est.txt or die不能打开文件句柄$!;my $io; $io = anyevent->io(fh => $fh,poll => r,cb => sub my $len = sysread( $fh, my $buf, 1 );if ($len > 0) print read '$buf'n;else undef $io;die 读出错 : $!;);$cv->recv;idle watchers基本语法代码如下 :my $w = anyevent->idle (cb =

9、> sub . );使用实例 :下面的例子 ,当整个程序中 ,没有其它事件在运行时 ,就会运行 idle .它就是当其它事件都在等待和空着的时候 ,所调用的 .代码如下 :#!/usr/bin/perluse strict;use anyevent;my $cv = anyevent->condvar;my $t; $t = anyevent->timer(after => 1,interval => 1,cb => sub print time().n );my $w; $w = anyevent-&

10、gt;idle(cb => sub warn idle;# undef $w;);$cv->recv; signal watchers基本语法如下,就是当接收到posix signal 的时候 ,运行callback 中的事件 .代码如下 :my $w = anyevent->signal (signal => term, cb => sub . ); child procrss watchers基本语法如下代码如下 :# child process exitmy $w = anyevent->child (p

11、id => $pid, cb => sub my ($pid, $status) = _;.);条件变量(多个条件时)这 个 是 anyevent 学 习 上 面 几 种 事 件 监 控 后 必 须 要 了 解 的 . 大 家 都 见 到 上 面 有 anyevent->condvar; 和 $cv->recv 这二个 ,condvar 是 condition variable 的简写 .是指当什么样的条件成立时的变量其实就是条件,当达到什么条件时退出事件循环.所以anyevent中没有传统事件中的looprecvend函数 .所以使用条

12、件变量就相当于让事件这个转起来.基本的$cv->recv是和$cv->send成对出现的 ,当事件调用send 时 ,就一定要有收到这个调用,才会退出事件.下面的$cv->begin和$cv->end也基本是这个意思.send 是单个条件.begin 和是多个条件成立时退出,换个语来讲,就是这些事件都成对的完成后,才退出事件.代码如下 :#!/usr/bin/perluse strict;use anyevent;my $cv = anyevent->condvar( cb => sub warn 调用结束 ;

13、);for my $i (1.10) $cv->begin;my $w; $w = anyevent->timer(after => $i, cb => sub warn finished timer $i;undef $w;$cv->end;);$cv->recv;默认的condvar 会对事件建一个条件为假的变量, 所以直接有send 和begin send 之类才会变成真 ,然后退出事件循环.可以给这个地方看成一个信号量来理解就好了.y如果条件不成立,在 anyevent 中事件会一直loop .所以上面

14、的例子中没有send .有关anyevent 其它 ,大家入门后可以玩玩象anyevent:http,twiggy之类 .看看这些应用和项目 .另外 ,在 anyevent 中我们常常使用ev .他是一个c 的 libev 的 perl 接口 ,有非常高的性能 .看完上面 ,在看看下面ev 的使用 ,非常容易吧 ,基本不变 .只是没出现条件变量,使用的传统的代码如下 :ev:loop;来使这个运行起来.use ev;# timersmy $w = ev:timer 2, 0, sub warn is called after 2s;my $w = ev:timer 2, 2, sub warn

15、 is called roughly every 2s (repeat = 2);undef $w; # destroy event watcher againmy $w = ev:periodic 0, 60, 0, sub warn is called every minute, on the minute, exactly;# iomy $w = ev:io *stdin, ev:read, sub my ($w, $revents) = _; # all callbacks receive the watcher and event mask warn stdin is readabl

16、e, you entered: , <stdin> ;# signalsmy $w = ev:signal 'quit', sub warn sigquit receivedn;# child/pid status changesmy $w = ev:child 666, 0, sub my ($w, $revents) = _;my $status = $w->rstatus;# stat changesmy $w = ev:stat /etc/passwd, 10, sub my ($w, $revents) = _;warn $w->path, has change

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论