茄子在线看片免费人成视频,午夜福利精品a在线观看,国产高清自产拍在线观看,久久综合久久狠狠综合

    <s id="ddbnn"></s>
  • <sub id="ddbnn"><ol id="ddbnn"></ol></sub>

  • <legend id="ddbnn"></legend><s id="ddbnn"></s>

    perl AnyEvent簡(jiǎn)單介紹和入門(mén)知識(shí)
    來(lái)源:易賢網(wǎng) 閱讀:1045 次 日期:2014-09-25 10:32:14
    溫馨提示:易賢網(wǎng)小編為您整理了“perl AnyEvent簡(jiǎn)單介紹和入門(mén)知識(shí)”,方便廣大網(wǎng)友查閱!

    什么是面向事件的編程(事件驅(qū)動(dòng)的編程):

    編程中所有的程序是由事件決定 – 可以是由用戶操作(鍵盤(pán),鼠標(biāo)),也可以是由其他程序和流的到達(dá)或者操作系統(tǒng)事件(如網(wǎng)絡(luò)數(shù)據(jù)包到達(dá))來(lái)觸發(fā)執(zhí)行.

    面向事件編程可以也被定義為,寫(xiě)一個(gè)計(jì)算機(jī)程序,在其中的代碼(通常程序的功能的頭部)被明確分配應(yīng)用程序的主回路,其代碼本身由兩部分組成方法:事件和事件處理的代碼。

    面向事件的編程通常被應(yīng)用在三種情況下:

    1.創(chuàng)建用戶界面的控制(包括圖形)

    2.創(chuàng)建一個(gè)基于服務(wù)器的應(yīng)用程序

    3.游戲編程時(shí)多個(gè)對(duì)象的管理

    我們系統(tǒng)管理時(shí),這種應(yīng)用在服務(wù)器的應(yīng)用程序中使用面向事件的編程很多,比如用于服務(wù)器應(yīng)用解決10,000個(gè)并發(fā)連接(所謂 C10k 問(wèn)題)

    AnyEvent 是一個(gè)性能非常好的基于事件驅(qū)動(dòng)的程序,有人使用它來(lái)解決 C10k 的問(wèn)題,象平時(shí)我們寫(xiě)的程序,都是基于過(guò)程.我們都是先做完事件1-> 然后做事件2->然后做事件3 .這種方式.

    但基于事件就完全不一樣了,在主流程中你基本只有一個(gè)主體框架,程序的動(dòng)作觸發(fā)都是由事件來(lái)驅(qū)動(dòng).比如我們使用的窗口程序.點(diǎn)最大化最小化,都是基于事件,當(dāng)接收到了最大化的事件做最大化事件那部分的程序開(kāi)始運(yùn)行.不在從頭到尾部來(lái)執(zhí)行.所以我們讀基于事件的程序,最好是畫(huà)成思維導(dǎo)圖來(lái)幫助我們理解.

    基于事件的程序常用到的最大好處是用來(lái)做異步,例如,我們要下載 100 個(gè)文件,下載完后對(duì)這些文件進(jìn)行處理.可能給每個(gè)下載和處理的過(guò)程寫(xiě)成事件,這些事件可以同步運(yùn)行(關(guān)鍵在于網(wǎng)絡(luò)連接和進(jìn)行文件的讀寫(xiě) IO 時(shí)要等待,事件是給這些等待復(fù)用起來(lái)).

    不知大家了解 Perl 中的 select 這個(gè)功能不,就是等到句柄可以讀或者寫(xiě)的時(shí)候,做不同的讀或者寫(xiě)的操作.事件循環(huán)也是一樣.

    在整個(gè) AnyEvent 入門(mén)中,我們只要關(guān)注二個(gè)點(diǎn)就行, WATCHERS(監(jiān)控者) 和 條件變量.

    WATCHERS(監(jiān)控者)

    在 select 中,有個(gè)角色叫"監(jiān)控者",就是 select 函數(shù)本身.

    在 AnyEvent 中不但可以監(jiān)控 IO 還可以監(jiān)控別的一些事件.來(lái)做不同的處理.我們可以看成這是不斷的盯著某件事情的人

    有如下幾個(gè)基本的內(nèi)置的可以用來(lái)盯著的事情("監(jiān)控者").

    TIMER : 監(jiān)控時(shí)間,到了一定的條件,然后對(duì)不同的時(shí)間做不同的事件

    I/O: 這個(gè)是監(jiān)控到 IO 是否可以讀寫(xiě),然后做相應(yīng)的事件

    IDLE: 空閑時(shí)做什么事件

    SIGNAL : 監(jiān)控觀查到不同的信息,調(diào)用相應(yīng)的事件

    CHILD PROCESS: 對(duì)子程序的狀態(tài)來(lái)調(diào)用相應(yīng)的處理事件

    TIMER WATCHERS

    基本語(yǔ)法

    代碼如下:

    AnyEvent->timer(

    after => $seconds, # 多久之后做相應(yīng)的操作.

    interval => $seconds, # 在上面條件生效后,每格多久進(jìn)行一次 callback.

    cb => $cb, # cb 是 callback 的簡(jiǎn)寫(xiě),所以知道了吧,只要到了前面的條件,就會(huì)運(yùn)行 cb => 指向的函數(shù).

    );

    使用實(shí)例:

    下面的例子是,5 秒后,每 2 秒進(jìn)行一次 callback 中的事件,直到 $w 這個(gè)注冊(cè)的事件被 undef 為止(也就是 $count > 10 次).這個(gè)中的 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 次調(diào)用";

    if ($count >= 10) {

    undef $w;

    }

    }

    );

    $cv->recv;

    I/O WATCHERS

    基本語(yǔ)法

    代碼如下:

    my $fh = ....; # 打開(kāi)一個(gè)句柄

    my $io; $io = AnyEvent->io(

    fh => $fh, # 上面打開(kāi)的句柄,也可以是標(biāo)準(zhǔn)輸入和輸出

    poll => "w", # 這個(gè)地方可以選擇 r 和 w 來(lái)表示讀和寫(xiě)的 IO 事件

    cb => sub {

    syswrite( $fh, "寫(xiě)入的內(nèi)容" );

    undef $io;

    }

    );

    使用實(shí)例:

    下面的例子,是使用 io 監(jiān)控到可以讀,就調(diào)用 cb 的函數(shù),直接讀文件 test.txt,每次一個(gè)字節(jié),直到讀完這個(gè)文件就通過(guò) undef 消掉這個(gè)事件.

    代碼如下:

    #!/usr/bin/perl

    use strict;

    use AnyEvent;

    my $cv = AnyEvent->condvar;

    open my $fh, "<test.txt" or die "不能打開(kāi)文件句柄 $!";

    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 "讀出錯(cuò): $!";

    }

    });

    $cv->recv;

    IDLE WATCHERS

    基本語(yǔ)法

    代碼如下:

    my $w = AnyEvent->idle (cb => sub { ... });

    使用實(shí)例:

    下面的例子,當(dāng)整個(gè)程序中,沒(méi)有其它事件在運(yùn)行時(shí),就會(huì)運(yùn)行 idle .它就是當(dāng)其它事件都在等待和空著的時(shí)候,所調(diào)用的.

    代碼如下:

    #!/usr/bin/perl

    use 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->idle(

    cb => sub {

    warn "idle";

    # undef $w;

    }

    );

    $cv->recv;

    SIGNAL WATCHERS

    基本語(yǔ)法如下,就是當(dāng)接收到 POSIX signal 的時(shí)候,運(yùn)行 callback 中的事件.

    代碼如下:

    my $w = AnyEvent->signal (signal => "TERM", cb => sub { ... });

    CHILD PROCRSS WATCHERS

    基本語(yǔ)法如下

    代碼如下:

    # child process exit

    my $w = AnyEvent->child (pid => $pid, cb => sub {

    my ($pid, $status) = @_;

    ...

    });

    條件變量(多個(gè)條件時(shí))

    這個(gè)是 AnyEvent 學(xué)習(xí)上面幾種事件監(jiān)控后必須要了解的.大家都見(jiàn)到上面有 AnyEvent->condvar; 和 $cv->recv這二個(gè),condvar 是 condition variable 的簡(jiǎn)寫(xiě).是指當(dāng)什么樣的條件成立時(shí)的變量

    其實(shí)就是條件,當(dāng)達(dá)到什么條件時(shí)退出事件循環(huán).所以 AnyEvent 中沒(méi)有傳統(tǒng)事件中的 loop 函數(shù).所以使用條件變量就相當(dāng)于讓事件這個(gè)轉(zhuǎn)起來(lái).

    基本的 $cv->recv 是和 $cv->send 成對(duì)出現(xiàn)的,當(dāng)事件調(diào)用 send 時(shí),就一定要有 recv 收到這個(gè)調(diào)用,才會(huì)退出事件.

    下面的 $cv->begin 和 $cv->end 也基本是這個(gè)意思.send 是單個(gè)條件.begin 和 end 是多個(gè)條件成立時(shí)退出,換個(gè)語(yǔ)來(lái)講,就是這些事件都成對(duì)的完成后,才退出事件.

    代碼如下:

    #!/usr/bin/perl

    use strict;

    use AnyEvent;

    my $cv = AnyEvent->condvar( cb => sub {

    warn "調(diào)用結(jié)束";

    });

    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;

    默認(rèn)的 condvar 會(huì)對(duì)事件建一個(gè)條件為假的變量,所以直接有 send 和 begin send 之類才會(huì)變成真,然后退出事件循環(huán).可以給這個(gè)地方看成一個(gè)信號(hào)量來(lái)理解就好了.y

    如果條件不成立,在 AnyEvent 中事件會(huì)一直 loop .所以上面的例子中沒(méi)有 send .

    有關(guān) AnyEvent 其它,大家入門(mén)后可以玩玩象 AnyEvent::HTTP,twiggy 之類.看看這些應(yīng)用和項(xiàng)目.

    另外,在 AnyEvent 中我們常常使用 EV .他是一個(gè) C 的 libev 的 Perl 接口,有非常高的性能.看完上面,在看看下面 EV 的使用,非常容易吧,基本不變.只是沒(méi)出現(xiàn)條件變量,

    使用的傳統(tǒng)的 EV::loop; 來(lái)使這個(gè)運(yùn)行起來(lái).

    代碼如下:

    use EV;

    # TIMERS

    my $w = EV::timer 2, 0, sub {

    warn "is called after 2s";

    };

    my $w = EV::timer 2, 2, sub {

    warn "is called roughly every 2s (repeat = 2)";

    };

    undef $w; # destroy event watcher again

    my $w = EV::periodic 0, 60, 0, sub {

    warn "is called every minute, on the minute, exactly";

    };

    # IO

    my $w = EV::io *STDIN, EV::READ, sub {

    my ($w, $revents) = @_; # all callbacks receive the watcher and event mask

    warn "stdin is readable, you entered: ", <STDIN>;

    };

    # SIGNALS

    my $w = EV::signal 'QUIT', sub {

    warn "sigquit received\n";

    };

    # CHILD/PID STATUS CHANGES

    my $w = EV::child 666, 0, sub {

    my ($w, $revents) = @_;

    my $status = $w->rstatus;

    };

    # STAT CHANGES

    my $w = EV::stat "/etc/passwd", 10, sub {

    my ($w, $revents) = @_;

    warn $w->path, " has changed somehow.\n";

    };

    # MAINLOOP

    EV::loop; # loop until EV::unloop is called or all watchers stop

    EV::loop EV::LOOP_ONESHOT; # block until at least one event could be handled

    EV::loop EV::LOOP_NONBLOCK; # try to handle same events, but do not block

    注:本文中大部分內(nèi)容來(lái)自日本的@lestrrat

    更多信息請(qǐng)查看IT技術(shù)專欄

    更多信息請(qǐng)查看腳本欄目
    易賢網(wǎng)手機(jī)網(wǎng)站地址:perl AnyEvent簡(jiǎn)單介紹和入門(mén)知識(shí)
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢?yōu)闇?zhǔn)!

    2026上岸·考公考編培訓(xùn)報(bào)班

    • 報(bào)班類型
    • 姓名
    • 手機(jī)號(hào)
    • 驗(yàn)證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
    工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
    云南網(wǎng)警備案專用圖標(biāo)
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
    云南網(wǎng)警報(bào)警專用圖標(biāo)