next up previous contents
suivant: Utiliser les sémaphores monter: La programmation multi-threadée précédent: Compiler une version multi-threadée   Table des matières

Réaliser un serveur SMTP multi-threadé

use threads;
use Perl6::Say;
use Net::SMTP::Server;
use Net::SMTP::Server::Client;

my $server = new Net::SMTP::Server('10.0.0.4','2525') or die $!;

while(my $cx = $server -> accept()) {
        threads -> create(\&process_email,$cx) -> detach();
}

sub process_email {
        my $cx = shift;
        my $client = new Net::SMTP::Server::Client($cx) or croak($!);
        $client -> process or return 0;

        say "Message from ". $client -> {FROM};
        my $tab = $client -> {TO};

        foreach my $to(@$tab) {
                say "Message to ". $to;
        }
# Do something with the mail
        return 0;
}

L'important, lorsque vous écrivez un programme multi-threadé, est de préciser à Perl que vous voulez utiliser le module threads le plus tôt possible dans le code. Dans l'idéal, placez le toujours tel qu'il est dans l'exemple ci-dessus.

Lorsqu'une connexion est établie via l'appel accept(), le serveur crée un thread fils qui va traiter la connexion et retourne répondre aux autres demandes.

La création d'un thread passe par la commande thread -> create(), la fonction create prend deux arguments, le premier est la référence de la fonction à appeller et le second est un tableau qui contient tous les arguments à passer à cette fonction.

Dans notre exemple, nous passons l'objet créé par la fonction create directement à la fonction detach(). Ceci rend simplement le thread fils autonome par rapport au père et ce dernier n'a pas besoin de savoir quand son fils aura terminé sa tache et mourra.

Lorsque le thread fils sort de sa fonction via la commande return(), il meurt tout simplement.


next up previous contents
suivant: Utiliser les sémaphores monter: La programmation multi-threadée précédent: Compiler une version multi-threadée   Table des matières
2006-03-15