ReLoad

Thierry Jaouen ~ WikiBlog
"Rien à foutre d'être lu, tant que je peux me relire."

Outils pour utilisateurs

Outils du site


blog:2015:02:12:boucle_event_en_perl

Boucle Event en Perl

En Perl, je vais proposer un simple exemple pour utiliser le module "AnyEvent".

Ce module permet de créer une boucle d'Event…
En C, c'est "libev" qui est (toujours?) utilisé…

Cette manière de programmer est parfois obligatoire pour ajouter des fonctionnalités a un framework , un peu comme ajouter des méthodes à un objet.

On n'a pas a savoir comment l'objet fonctionne, et on a juste a y insérer ses petites fonctionnalités dedans.

Dans d'autres situations, c'est pour avoir un programme qui ne bloque pas sur des traitements “long”… DNS , Socket , …

~~READMORE~~

#!/usr/bin/env perl

use strict;
use warnings;

use AnyEvent;

# Exemple: (libev) Event en Perl
#
# Intro: http://search.cpan.org/~mlehmann/AnyEvent-7.08/lib/AnyEvent/Intro.pod
# Source: http://search.cpan.org/~mlehmann/AnyEvent/lib/AnyEvent.pm

$|=1;

my $count = 0;

# cv -> Condition Variable
my $cv;

# Créer un event sur timer, execute 1 fois
my $w1 = AE::timer( 3, 0, sub { print "Event: hello 3 (once)\n"; } );

# Créer un event sur timer, execute toutes les secondes
my $w2 = AE::timer( 3, 1, sub {
    print "Event: hello 3 (for each second)\n"; 
    # si une condition est atteinte, alors quitter la boucle event.
    $cv->send('hello','world',AE::now) if (++$count%5)==0;  
  } );

# Un event associe a un signal 
my $w3 = AE::signal USR1 => sub { print STDERR "Signal: coucou\n"; };

# Un event associe au signal ^C
my $w4 = AE::signal INT => sub { die "break"; };

# Eventuellement, autre chose a faire...
#my $w5 = AE::idle( sub { sleep(1); } );

print "Waiting 3 secondes before first events...\n";

foreach ( 0 .. 2 )
{
  # Créer la "Condition Variable"
  # (la recreer a chaque fois que la Condition Variable est devenu vrai)

  $cv = AE::cv;

  # Attendre le "send" associe a ce "cv"
  my @bla = $cv->recv;      # <-- event loop

  # On a recupere les parametres du "send"

  print "recv: " , join('|',@bla), "( $count )\n";
}

undef $cv;

#undef $w5;
undef $w4;
undef $w3;
undef $w2;
undef $w1;

print "Fin.\n";

# --------------------------
# EOF

Résultat:

Waiting 3 secondes before first events...
Event: hello 3 (once)
Event: hello 3 (for each second)
Event: hello 3 (for each second)
Event: hello 3 (for each second)
Event: hello 3 (for each second)
Event: hello 3 (for each second)
recv: hello|world|1403760002.88818( 5 )
Event: hello 3 (for each second)
Event: hello 3 (for each second)
Event: hello 3 (for each second)
Event: hello 3 (for each second)
Event: hello 3 (for each second)
recv: hello|world|1403760007.8882( 10 )
Event: hello 3 (for each second)
Event: hello 3 (for each second)
Event: hello 3 (for each second)
Event: hello 3 (for each second)
Event: hello 3 (for each second)
recv: hello|world|1403760012.8882( 15 )
Fin.
blog/2015/02/12/boucle_event_en_perl.txt · Dernière modification: 2015/02/12 19:02 par thierry