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.